我有这两个问题:
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),版本 35.1,修订版 666
最佳答案
LIMIT
优化似乎只有在有 ORDER BY
子句时才适用于 GROUP BY
。正如 Gordon Linoff 在之前(已删除)的回答中所建议的那样,GROUP BY
查询有一个隐式的 ORDER BY
。因此,GROUP BY
查询使用了LIMIT
优化。
尽管 DISTINCT
查询基本上使用 GROUP BY
来解决它,隐式的 ORDER BY
并不存在。将显式 ORDER BY
子句添加到 DISTINCT
查询会产生与 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;
关于mysql - 几乎相同的查询给出不同的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24532691/