SQL GROUP BY性能瓶颈集中在数据扫描、分组定位和聚合计算三环节:无索引导致全表扫描;隐式排序触发临时表与文件排序;分组键分散或聚合复杂加剧CPU与内存压力。
SQL GROUP BY 的性能瓶颈主要集中在三个环节:数据扫描、分组定位和聚合计算。它不是单纯“慢”,而是每个环节都可能被放大——尤其当数据量上升、索引缺失或写法不当的时候。
如果 GROUP BY 字段没有索引,或者索引未被有效利用(比如用了函数、顺序不匹配),数据库只能逐行读取整张表。type=ALL 的 EXPLAIN 结果就是典型信号。百万级表全扫一遍,光磁盘读取就耗掉大半时间。
MySQL 默认会对 GROUP BY 字段隐式排序,若无法利用索引顺序完成分组,就会创建临时表(Using temporary),并可能落盘排序(Using filesort)。一旦 tmp_table_size 或 sort_buffer_size 不足,就会写磁盘,I/O 成为最大瓶颈。
分组键越分散、值越多,需要维护的“桶”就越多;聚合函数越复杂(尤其是 DISTINCT、子查询嵌套、JSON 处理),CPU 开销就越大。例如 COUNT(DISTINCT user_id) 在千万级数据上常需哈希+排序双阶段,内存压力陡增。
在 MySQL 8.0 之前,GROUP BY 总是附带排序行为,哪怕你根本不需要结果有序。这多出来的 O(n log n) 排序成本,在数据量大时非常可观。