0

很抱歉有很多无用的文字。最后 3 段讲述了最重要的事情:D

最近我们在其中一台客户端服务器中遇到了一些 mysql 问题。一些出乎意料的事情开始了 mysql 进程的 CPU 飙升。这个问题导致我们发现和优化错误的查询,这是一个问题。

我在想优化正在加速查询(执行查询所需的总时间)。但是在针对它优化了几个查询之后,我的同事开始同事开始抱怨一些查询读取了太多行,所有行都来自表(如 EXPLAIN 所示)。

重写查询后,我注意到,如果我希望查询读取更少的行 - 查询速度会受到影响,如果我查询是为了速度 - 会读取更多的行。

这对我来说毫无意义:读取的行数更少,但执行时间更长

这让我想知道应该怎么做。当然,拥有读取最少行的快速查询将是完美的。但由于这对我来说似乎不可能,我正在寻找一些答案。我应该采取哪种方法 - 加快或减少读取行数?当查询速度很快但读取的行数更多,而当读取的行数减少而速度受到影响时,有什么优点和缺点?服务器在不同情况下会发生什么?

谷歌搜索后,我只能找到关于如何提高速度的文章和讨论,但都没有涵盖我之前提到的那些不同的案例。

当然,我期待着看到一些个人的选择。也欢迎可以指导我正确方式的链接。

4

3 回答 3

2

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

我可能会考虑为您的某些列编制索引,这些列会使您的搜索更加复杂。查找简单数据类型比查找复杂数据类型更快。查看您是否正在搜索索引列。

于 2013-05-09T18:23:40.187 回答
2

无论如何,EXPLAIN 报告的读取行数是一个估计值——不要把它当作文字值。请注意,如果您对同一个查询多次运行 EXPLAIN,则每次读取的行数都会发生变化。这个估计甚至可能完全不准确,因为 EXPLAIN 中不时出现错误。

另一种衡量查询性能的方法是SHOW SESSION STATUS LIKE 'Handler%'在测试查询时。这将告诉您SQL 层向存储引擎层请求单个行的次数的准确计数。例如,请参阅我的演示文稿,SQL 查询模式,优化

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

很难了解逻辑行请求与物理 I/O 读取之间的差异。在 Percona Server 中,对慢查询日志的增强包括每个查询的 InnoDB I/O 操作计数。

于 2013-05-09T18:25:23.740 回答
2

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

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