几乎相等的查询会给出不同的执行时间

时间:2014-07-02 13:40:00

标签: mysql group-by distinct explain

我有这两个问题:

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

1 个答案:

答案 0 :(得分:2)

LIMIT子句出现时,GROUP BY优化似乎只适用于ORDER 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;