我最近在继承的程序中遇到了一个长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
是障碍而不是优化器?
答案 0 :(得分:1)
GROUP BY
子句即使没有使用实际的聚合函数,也意味着对RDBMS的附加处理,以便检查是否需要对某些记录进行聚合。因此,删除不必要的{{1}}时,您所看到的提升。
您共享的链接说明,MySQL某种程度上松散的行为可能被设计为一种缩短聚合查询语法的方法。按一个字段分组意味着其他字段也将被分组,并可能作为优化。无论如何,这并不适合您的用例,因为您实际上不需要聚合。
答案 1 :(得分:0)
从mysql 5.6开始不允许使用不带聚合功能的group by(出于明显的原因。
对于版本5.7之前的版本,group by子句将为所有不在聚合函数中的列提取一个(因果)值。这将导致这些列的不可预测的结果..产生了扫描所有行的工作需求并提取结果而降低性能。