我有这两个问题:
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
答案 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;