为什么没有聚合的结尾Group By会减慢我的查询速度?

时间:2019-01-04 20:18:36

标签: mysql

我最近在继承的程序中遇到了一个长SQL查询,该查询连接了8个表和3个视图。使用EXPLAIN,我看到它是7次唯一键查询和4次非唯一键查询。平均而言,获取350行花了18秒(这有很多原因,这3个视图中的每个视图都是由一个视图组成的),然后,我注意到GROUP BY tableone.id没有任何聚合。我删除了它,现在它以毫秒为单位运行。

现在令人困惑的部分是,我然后查找了为什么MySQL允许没有聚合函数的GROUP BY语句,并了解到它实际上是一种优化技术(Why does MySQL allow "group by" queries WITHOUT aggregate functions?)。

在我看来,情况显然并非如此。那为什么呢?何时悬而未决的GROUP BY是障碍而不是优化器?

2 个答案:

答案 0 :(得分:1)

GROUP BY子句即使没有使用实际的聚合函数,也意味着对RDBMS的附加处理,以便检查是否需要对某些记录进行聚合。因此,删除不必要的{{1}}时,您所看到的提升。

您共享的链接说明,MySQL某种程度上松散的行为可能被设计为一种缩短聚合查询语法的方法。按一个字段分组意味着其他字段也将被分组,并可能作为优化。无论如何,这并不适合您的用例,因为您实际上不需要聚合。

答案 1 :(得分:0)

从mysql 5.6开始不允许使用不带聚合功能的group by(出于明显的原因。

对于版本5.7之前的版本,group by子句将为所有不在聚合函数中的列提取一个(因果)值。这将导致这些列的不可预测的结果..产生了扫描所有行的工作需求并提取结果而降低性能。