首页/数据/SQL 速查/GROUP BY 的执行方式与索引
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

GROUP BY 的执行方式与索引

分组可通过索引顺序、排序或哈希完成:EXPLAIN 显示临时表或排序时,优先考虑让分组借用索引。

SQL 速查数据更新于 2026-10-12

示例

示例
-- (user_id, status) 复合索引:分组列与索引前缀一致
EXPLAIN SELECT user_id, status, COUNT(*)
FROM orders
GROUP BY user_id, status;
-- MySQL 可能显示:Using index for group-by

-- PG:观察 HashAggregate 与 GroupAggregate
EXPLAIN (ANALYZE) SELECT user_id, status, COUNT(*)
FROM orders
GROUP BY user_id, status;
MySQLUsing index for group-by 表示借索引完成分组,避免临时表与排序
PostgreSQLHashAggregate 走哈希表;GroupAggregate 依赖有序输入
哈希聚合受 work_mem 限制,超限时分批处理(PG 输出中显示 Batches)

易错点

  • 以为 GROUP BY 有索引就一定免排序:还需分组列匹配索引前缀,且没有被阻止使用的条件
  • 只看 MySQL 的 Using temporary 下结论:PG 侧要看 HashAggregate 与 GroupAggregate 的差异

数据来源与参考

  • MySQL 8.0 Reference Manual · GROUP BY Optimization
  • PostgreSQL Documentation · Aggregate Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌