很抱歉有很多没用的短信。最重要的东西是关于最后三段的:D。
最近,我们在一个客户端服务器上遇到了一些mysql问题。一些突然出现的东西启动了mysql进程的CPU。这个问题导致我们查找和优化糟糕的查询,下面是一个问题。
我认为优化正在加速查询(执行查询所需的总时间)。但是,在优化了几个针对它的查询之后,我的同事开始抱怨有些查询读取了太多行,所有行都从表中读取(如解释中所示)。
重写查询之后,我注意到,如果我想要一个查询读取较少的行--查询速度会受到影响,如果我的查询是为了速度--会读取更多的行。
这没有道理:读行少了,但执行时间长了
这让我想知道该怎么做。当然,拥有读取最少行的快速查询将是完美的。但既然这对我来说是不可能的,我正在寻找一些答案。我应该采用哪种方法--读行更快还是更少?当查询速度较快,但读取的行较多,读取的行较少,且速度较快时,利弊是什么?服务器在不同情况下会发生什么?
谷歌搜索后,我能找到的只是关于如何提高速度的文章和讨论,但都没有涵盖我之前提到的不同案例。
我期待着看到甚至个人的选择,当然,有一些理由。链接,可以指导我正确的方式,也欢迎。
发布于 2013-05-09 10:23:40
我认为您的问题取决于如何限制读取行的数量。如果您通过实现MySQL需要运行的更多WHERE子句来读取较少的行,那么是的,性能将受到影响。
我会考虑索引您的一些列,使您的搜索更加复杂。与复杂数据类型相比,简单数据类型查找速度更快。查看是否正在搜索索引列。
发布于 2013-05-09 10:24:18
如果没有更多的数据,我可以给你一些提示:
group by
去重复行,则会浪费资源;最好使用select distinct
(在索引字段上)。发布于 2013-05-09 10:25:23
EXPLAIN报告的行数无论如何都是一个估计值--不要把它当作一个文字值。注意,如果在同一查询上多次运行EXPLAIN,每次读取的行数都会发生变化。这个估计甚至可能是完全不准确的,因为在解释中不时会出现错误。
在测试查询时,另一种衡量查询性能的方法是SHOW SESSION STATUS LIKE 'Handler%'
。这将告诉您SQL层向存储引擎层请求单个行的次数。例如,请参阅我的演示文稿,SQL查询模式,优化。
还存在一个问题,即请求的行是否已经在缓冲池中(假设您使用InnoDB),或者查询是否必须从磁盘读取它们,从而引发I/O操作。从磁盘读取的少数行可能比从RAM读取的大量行慢数量级。这不一定说明您的情况,但它指出,这种情况可能发生,“行读取”并不能告诉您查询是否导致I/O。由于InnoDB的多版本控制,单个行甚至可能存在多个I/O操作。
了解逻辑行请求与物理I/O读取之间的差异是很难的。在Percona中,对缓慢查询日志的增强包括每个查询的InnoDB I/O操作计数。
https://stackoverflow.com/questions/16468350
复制