MySQL 8.0 的 GROUP BY 不再隐式排序,必须显式加 ORDER BY 才能保证结果可比;8.0.19+ 支持哈希聚合(需满足列类型、聚合函数等条件),而流聚合在两版本中依赖索引有序性但优化策略不同。

MySQL 8.0 的 GROUP BY 不再隐式排序,测试前必须加 ORDER BY
如果你直接拿一条带 GROUP BY 的语句在两个版本上跑基准测试,结果不可比——5.7 默认“看起来有序”,8.0 默认“完全随机”。这种顺序差异会干扰你对真实聚合性能的判断,尤其当后续逻辑依赖顺序(比如 LIMIT 配合分页)时,5.7 可能“碰巧快”,8.0 却触发额外排序开销。
实操建议:
- 所有对比测试必须显式加上
ORDER BY,例如:SELECT department, COUNT(*) FROM employees GROUP BY department ORDER BY department - 若只关心聚合本身(不关心输出顺序),则 8.0 的执行计划中应避免出现
Using filesort;而 5.7 即使没写ORDER BY,EXPLAIN 里也常带这个提示 - 用
EXPLAIN FORMAT=TREE(仅 8.0 支持)可直观看到是否走“Hash Aggregate”;5.7 只能靠EXPLAIN+Extra字段推测是否用临时表
哈希聚合(Hash Aggregate)在 MySQL 8.0 中如何启用
MySQL 8.0.19+ 引入了真正的哈希聚合执行策略,替代传统基于排序或临时表的流式分组。它不依赖索引顺序,适合高基数、无序输入场景,但需满足几个硬性条件:
- GROUP BY 列不能是 LOB 类型(如
TEXT、BLOB) - 聚合函数仅限
COUNT()、SUM()、AVG()、MIN()、MAX();含DISTINCT或窗口函数会退回到临时表 - 优化器估算的内存足够:受
cte_max_recursion_depth和sort_buffer_size间接影响,但主要看tmp_table_size和max_heap_table_size - 确认是否启用:执行
EXPLAIN FORMAT=TREE,看到-> Hash Aggregate行即为命中
示例:
EXPLAIN FORMAT=TREE SELECT status, COUNT(*) FROM orders GROUP BY status;
若返回中含 Hash Aggregate,说明走哈希路径;若为 Temporary table + Filesort,说明退化到传统流聚合。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
流聚合(Streaming Aggregate)在 5.7 和 8.0 下的实际表现差异
流聚合依赖输入已按 GROUP BY 键有序,典型路径是“索引扫描 → 分组累加 → 输出”。它内存友好、延迟低,但强绑定索引结构。5.7 和 8.0 都支持,但行为不同:
- 5.7:只要存在可用索引(哪怕非最左前缀),优化器倾向强行走索引扫描+流聚合,即使实际效率不高;容易因索引选择偏差导致慢查询
- 8.0:优化器更激进地评估成本,即使有索引,若估算行数多、key size 大,也可能放弃流聚合,改用哈希聚合或磁盘临时表
- 验证方式:用
EXPLAIN看type是否为index或range,且Extra含Using index for group-by(5.7)或Using index for group-by (scanning)(8.0) - 陷阱:8.0 中
Using index for group-by不代表一定比哈希快;若分组键重复率极低(如主键分组),哈希反而更稳
测试时最容易被忽略的配置与数据准备点
很多性能对比失真,不是因为引擎差异,而是环境没对齐:
- 关闭查询缓存:
SET SESSION query_cache_type = OFF(5.7);8.0 已移除该功能,无需操作 - 统一临时表策略:确保
tmp_table_size和max_heap_table_size在两版本中设为相同值,否则 5.7 更容易落盘,8.0 更倾向内存哈希 - 数据分布要真实:避免用
INSERT ... SELECT RAND()生成均匀数据;用业务脱敏样本,尤其注意分组键的基数(cardinality)和倾斜度(skew) - 禁用隐形特性干扰:8.0 默认开启
caching_sha2_password认证,若压测工具未适配,可能引入连接层抖动;建议测试时统一用mysql_native_password
复杂点在于:哈希聚合的收益高度依赖数据特征和并发压力。单线程下可能看不出差别,但 64 并发以上,8.0 的哈希路径在锁竞争和内存局部性上优势明显——这点常被简单 sysbench 测试遗漏。










