分组统计慢的主因是GROUP BY字段未建索引导致全表扫描与文件排序应为分组字段建联合索引、避免函数干扰、优先用COUNT(*)、下推WHERE条件、预建汇总表或物化视图并关注字段基数影响。GROUP BY 字段没加索引查询慢得离谱绝大多数分组统计慢根本原因是 GROUP BY 后的字段没走索引。MySQL、PostgreSQL 都会先排序再分组除非用哈希聚合而排序在无索引时就是全表扫描 文件排序数据量一过百万秒变卡顿。实操建议对 GROUP BY 中出现的所有字段联合建索引顺序要和 SQL 中一致比如 SELECT dept, status FROM orders GROUP BY dept, status → 建 (dept, status) 联合索引避免在 GROUP BY 字段上用函数或表达式如 GROUP BY DATE(created_at) 会让索引失效改用范围查询 预计算列或物化视图PostgreSQL 8.4 支持 CREATE INDEX ... INCLUDE把 SELECT 中的非分组字段如 COUNT(*) 不需要但 SUM(amount) 的 amount放进索引覆盖减少回表WHERE 条件没下推分组前就扫全表很多人写成 SELECT region, COUNT(*) FROM sales GROUP BY region HAVING SUM(amount) 10000结果发现还是慢——因为 HAVING 是分组后过滤引擎必须先把所有行分完组才筛中间过程毫无压缩。实操建议把能提前过滤的条件尽量挪到 WHERE比如地区限定、时间范围、状态筛选哪怕只是加个 WHERE created_at 2024-01-01也能砍掉 90% 数据量HAVING 只留真正依赖聚合结果的逻辑例如“平均单价 500”“订单数 100”别用它代替 WHEREMySQL 8.0 和 PostgreSQL 支持部分下推优化但不保证生效用 EXPLAIN 看 rows 和 Extra 字段确认是否真的提前剪枝COUNT(*) vs COUNT(字段)执行计划可能完全不同看着都是计数但 COUNT(*) 和 COUNT(col) 对索引利用差异极大。前者可走任意非空索引甚至主键后者必须确保该字段允许为 NULL 且实际有值否则可能退化为全表扫描。 Zeemo AI 一款专业的视频字幕制作和视频处理工具