为啥没有聚合的结束 Group By 会减慢我的查询速度?

Posted

技术标签:

【中文标题】为啥没有聚合的结束 Group By 会减慢我的查询速度?【英文标题】:Why would a ending Group By without an aggregate slow down my query?为什么没有聚合的结束 Group By 会减慢我的查询速度? 【发布时间】:2019-01-04 20:18:35 【问题描述】:

我最近在继承的程序中遇到了一个长 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 是障碍而不是优化器?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

...这引出了一个问题,为什么您自己的答案会使用这种“技术”;-)【参考方案2】:

从mysql 5.6开始不再允许使用不带聚合函数的group by(原因很明显。

对于 5.7 之前的版本,group by 子句的工作是为不在聚合函数中的所有列提取(因果)值..其他然后这些列的不可预测的结果..产生扫描所有行的工作需要并提取性能下降的结果。

【讨论】:

我忘了说,是的,我使用的是 MySQL 5.6。在这个程序的其他查询中,我看到了同样的事情并删除了 GROUP BY,认为它会像这个一样加快它的速度,但现在它们运行得更慢了。只是好奇为什么。我不确定我是否完全理解你在说什么。 对于每个组,db 引擎必须生成一个临时表来存储(非)聚合结果,然后在对组进行 ful 扫描之后 .. 将 rsult 用于查询的另一部分需要.. 嗯,我觉得是相反的

以上是关于为啥没有聚合的结束 Group By 会减慢我的查询速度?的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有聚合函数的选择列需要成为 MySQL 中 Group by 子句的一部分?

为啥一个 group by 的聚合这么慢?

为啥 CROSS APPLY 与列和聚合函数需要 Group by

为啥 SQL 强制我在 GROUP BY 子句中重复 SELECT 子句中的所有非聚合字段? [关闭]

聚合 MySQL 数据,正在使用 group by,但它并没有完全符合我的要求

GROUP BY 子句必须与聚合函数一起使用?