mysql - 几乎相同的查询给出不同的执行时间

标签 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

最佳答案

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/

相关文章:

MySQL 离开加入子查询分组依据

mysql - 两个整数列之间的差异无法按预期工作

mysql - Innobackupex 从 SSH 恢复

python - 如何过滤 pandas 数据框以便保留组中的第一行和最后一行?

php - 匹配过程中如何避免重复?

R:在保持顺序的同时折叠列中的重复值

php - 如何在我的查询 CODEIGNITER 中使用 DISTINCT

mysql - 如何使用 Lookup 函数对表中列的值求和

mysql - 使用查询生成器进行复杂的连接查询

python - pandas:groupby 和聚合而不会丢失分组的列