从源码角度,深度解读 MySQL 优化器的 GROUP BY 优化策略

💡 原文中文,约14400字,阅读约需35分钟。
📝

内容提要

本文讨论了MySQL 8.0.22中GROUP BY的工作原理和查询优化器中的优化逻辑,介绍了四种GROUP BY的实现方式和优化建议,以及GaussDB(for MySQL)的兼容性和并行查询支持。

🎯

关键要点

  • MySQL 8.0.22 中 GROUP BY 的工作原理和优化逻辑

  • GROUP BY 允许用户依据列的值对结果集进行分组,通常与聚合函数结合使用

  • GROUP BY 的实现方式分为松散索引扫描、紧凑索引扫描、临时表和外部排序

  • 松散索引扫描利用索引扫描实现 GROUP BY,需满足特定条件

  • 紧凑索引扫描在符合最左前缀原则时使用索引,避免额外排序

  • 临时表用于存储中间结果,可能导致大量磁盘 I/O 操作

  • MySQL 8.0.13 及以后的版本不再支持 GROUP BY 的外部排序功能

  • 查询优化器决定如何执行 GROUP BY 查询,包括索引选择和临时表使用

  • GaussDB(for MySQL) 支持 GROUP BY 隐式排序和并行查询处理

  • 优化建议包括创建合适的索引、使用合适的聚合函数、优化查询结构和参数配置

  • 使用 ONLY_FULL_GROUP_BY 模式可提高查询的正确性和一致性

延伸问答

MySQL 8.0.22 中 GROUP BY 的工作原理是什么?

MySQL 8.0.22 中 GROUP BY 通过查询优化器进行多种优化,主要实现方式包括松散索引扫描、紧凑索引扫描、临时表和外部排序。

如何优化 MySQL 中的 GROUP BY 查询?

优化建议包括创建合适的索引、使用合适的聚合函数、优化查询结构、调整参数配置以及使用 ONLY_FULL_GROUP_BY 模式。

GaussDB(for MySQL) 对 GROUP BY 的支持有哪些?

GaussDB(for MySQL) 支持 GROUP BY 隐式排序和并行查询处理,增强了与 MySQL 的兼容性。

什么是松散索引扫描和紧凑索引扫描?

松散索引扫描利用索引扫描实现 GROUP BY,需满足特定条件;紧凑索引扫描则在符合最左前缀原则时使用索引,避免额外排序。

MySQL 8.0.13 及以后的版本对 GROUP BY 有什么变化?

MySQL 8.0.13 及以后的版本不再支持 GROUP BY 的外部排序功能,返回结果可能是无序的。

使用 ONLY_FULL_GROUP_BY 模式有什么好处?

使用 ONLY_FULL_GROUP_BY 模式可以提高查询的正确性和一致性,确保未在 GROUP BY 中列出的非聚合列不出现在 SELECT 列表中。

➡️

继续阅读