【问题标题】:Almost equal queries give different execution times几乎相等的查询给出不同的执行时间
【发布时间】:2014-08-23 08:05:32
【问题描述】:

我有这两个问题:

SELECT SQL_NO_CACHE DISTINCT(type) FROM actions LIMIT 0, 30;

SELECT SQL_NO_CACHE type FROM actions GROUP BY type LIMIT 0, 30;

如果我不使用 LIMIT 子句,执行时间是相等的。另一方面,在我的例子中,第一个查询需要将近 0.8 秒,而第二个需要 0.12 秒。

使用EXPLAIN,似乎唯一的区别是第一个查询使用了临时表,而第二个没有。

在这一点上,我对这两个查询的不同行为感到非常惊讶……您能对这个问题提供一些启示吗?

我目前使用的是 MYSQL 5.5.37-35.1 Percona Server (GPL),Release 35.1,Revision 666

【问题讨论】:

  • 我假设第二个查询管理使用 GROUP BY 的类型索引。
  • coz Distinct 意味着额外的工作要做,忽略重复的条目,这就是为什么要花更多时间。
  • @Kickstart 两个查询都使用类型索引
  • @VedantTerkar 根据 mysql 文档 DISTINCT 应​​该是 GROUP BY 的特例。请记住,如果没有 LIMIT 子句,查询的执行方式相同
  • type 是什么数据类型(和长度)?

标签: mysql group-by distinct explain


【解决方案1】:

似乎LIMIT 优化仅在存在ORDER BY 子句时才适用于GROUP BY。正如 Gordon Linoff 在较早(已删除)的答案中所建议的那样,GROUP BY 查询具有隐含的ORDER BY。因此,GROUP BY 查询使用了LIMIT 优化。

尽管DISTINCT 查询基本上使用GROUP BY 来解决它,但隐含的ORDER BY 并不存在。向DISTINCT 查询添加显式ORDER BY 子句会产生与GROUP BY 查询相同的执行计划和相同的性能:

SELECT SQL_NO_CACHE DISTINCT(type) FROM actions ORDER BY type LIMIT 0, 30;

SELECT SQL_NO_CACHE type FROM actions GROUP BY type LIMIT 0, 30;

【讨论】:

  • 我完全同意。 (而且我想知道为什么答案被删除了:)。)但我想知道为什么 DISTINCT 不隐式使用 ORDER BY 时有一个索引可以使其快速。此外,我尝试了与问题中的查询类似的查询,最终结果的顺序相同 - 您认为出于某种原因这是可以预期的吗?谢谢
  • @idrarig,我猜是隐式或显式ORDER BY 触发了LIMIT 优化,不管发生了什么。当然还有改进的余地。
猜你喜欢
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 2014-12-18
  • 2012-04-15
  • 1970-01-01
相关资源
最近更新 更多