2013-05-09 67 views
0

对不起,无用的文本很多。最重要的东西是告诉最后3段:DMySQL查询速度或行读取

最近我们在客户端服务器之一有一些MySQL问题。蓝色的东西开始摇摇欲坠的MySQL进程的CPU。这个问题导致我们找到并优化错误的查询,这是一个问题。

我在想优化会加快查询速度(查询执行所需的总时间)。但是,在优化了几个查询之后,我的同事开始同事开始抱怨某些查询读取了太多行,表中的所有行(如EX​​PLAIN所示)。

重写一个查询后,我注意到,如果我想查询读取较少的行 - 查询速度受到影响,如果我查询速度 - 读取更多的行。

,但这并没有让我的感觉:更少的行阅读,但执行时间较长

这让我不知道应该做什么。当然,如果快速查询读取最少的行,那将是完美的。但是,因为它似乎不可能为我,我正在寻找一些答案。我应该采用哪种方法 - 读取速度更快或更少的行?什么是&缺点当查询是快速的,但有更多的行读取和更少的行读速度遭受?在不同情况下服务器会发生什么?

Google搜索后,我可以找到所有关于如何提高速度的文章和讨论,但都没有涵盖我之前提到的那些不同情况。

我期待着看到甚至个人选择当然有一些推理。 可以直接指导我的链接也是受欢迎的。

+0

你的断言并非总是如此。每种情况都有特异性。如果您根据您的业务需要设计*正确* SQL查询*,那么记录集返回的行数无关紧要。 – Sebas 2013-05-09 18:26:56

回答

2

我认为你的问题取决于你如何限制读取的行数。如果你通过实现更多的MySQL需要运行的WHERE子句来读取更少的行,那么是的,性能将会受到影响。

我想看看可能将您的某些列编入索引,这会使您的搜索更加复杂。简单的数据类型比复杂的查询更快。看看你是否正在搜索索引列。

2

如果没有更多的数据,我可以给你一些提示:

  1. 要确保你的表是正确索引。为每个表创建适当的索引。同时删除不需要的索引。
  2. 确定每个查询的最佳方法。例如,如果仅使用group by来删除重复数据行,则表示正在浪费资源;最好使用select distinct(在索引字段上)。
  3. “分而治之”。你能在两个,三个或更多的中间步骤中分解你的过程吗?如果答案是“是”,那么:您是否可以为其中一些步骤创建临时表?我已经使用临时表分割了进程,并且它们对于加快速度非常有用。
2

无论如何,EXPLAIN报告的读取行数是一个估计 - 不要把它作为字面值。请注意,如果多次对相同的查询运行EXPLAIN,则每次读取的行数都会更改。这个估计甚至可能是完全不准确的,因为时不时会有EXPLAIN中的错误。

在测试查询时,另一种度量查询性能的方法是SHOW SESSION STATUS LIKE 'Handler%'。这会告诉你准确的 SQL层向存储引擎层对单个行发出请求的次数。例如,请参阅我的演示文稿SQL Query Patterns, Optimized

还有一个问题,请求的行是否已经在缓冲池中(我假设你使用InnoDB),或者查询是否必须从磁盘读取它们,引发I/O操作。从磁盘读取的少量行可能比从RAM读取的大量行慢几个数量级。这并不一定解释你的情况,但它指出可能发生这种情况,并且“行读取”不会告诉你查询是否导致了I/O。由于InnoDB的多版本化,甚至有可能是多个单行的I/O操作。

洞察逻辑行请求与物理I/O读取之间的区别很难获得。在Percona Server中,enhancements to the slow query log包含每个查询的InnoDB I/O操作数。