我最近在继承的程序中遇到了一个长sql查询,它连接了8个表和3个视图。使用 EXPLAIN
,我看到了7个唯一键查找和4个非唯一键查找。平均来说,获取350行需要18秒(原因有很多,这3个视图中的每一个都是由其他视图组成的) GROUP BY tableone.id
不含任何骨料。我删除了它,现在它以毫秒为单位运行。
现在让人困惑的是,我接着查找了为什么mysql允许 GROUP BY
语句,并了解到它实际上是一种优化技术(为什么mysql允许“groupby”查询没有聚合函数?)。
我的情况显然不是这样。那为什么呢?什么时候是悬挂的 GROUP BY
一个障碍而不是优化器?
2条答案
按热度按时间mmvthczy1#
从MySQL5.6开始就不允许使用GROUPBY WITH AGGRATION函数(原因很明显)。
对于5.7版本的previos,groupby子句将为所有不在聚合函数中的列提取一个(因果)值。。这将为这些列带来不可预知的结果。。产生对所有行的扫描所需的工作,并提取性能下降的结果。
idfiyjo82#
这个
GROUP BY
子句,即使没有使用实际的聚合函数,也意味着对rdbms进行额外的处理,以便检查是否需要聚合某些记录。因此,当移除不必要的GROUP BY
.您共享的链接解释说,mysql的这种松散行为可能是为了缩短聚合查询的语法而设计的,其中按一个字段分组意味着其他字段也在分组,也可能是为了优化。无论如何,这并不适合您的用例,您实际上不需要聚合。