为什么执行SQL GROUP BY操作时数据库CPU使用率会瞬间打满?

星宇酱_7735

星宇酱_7735

2026-11-10

785人浏览

原创

GROUP BY触发全表扫描+HASH聚合导致CPU飙升,根本原因是WHERE未走索引或缺失,致使数据库需加载全部数据进内存分组;应确保WHERE条件命中索引、GROUP BY字段顺序与联合索引严格一致、避免函数/类型转换,并控制SELECT字段减少回表开销。

为什么执行sql group by操作时数据库cpu使用率会瞬间打满?

GROUP BY 触发全表扫描 + HASH 聚合,CPU 直接飙高

不是 GROUP BY 本身慢,而是它前面没拦住数据——如果 WHERE 条件没走索引、或根本没加 WHERE,MySQL/PostgreSQL 就得先把几百万行全读进内存,再逐行哈希分桶、计算聚合值。这个过程几乎纯靠 CPU,不怎么依赖磁盘,所以 top 看到的是 sqlservr 或 mysqld 进程占满 CPU,而不是 IO 等待。

常见错误现象:

  • EXPLAIN 显示 type: ALL 或 rows 值远超预期(比如表有 500 万行,rows 显示 480 万)
  • 执行计划里出现 HashAggregate 或 HASH GROUP BY,且 Batches > 1(说明内存不够,开始写磁盘临时文件)
  • MySQL 的 SHOW PROCESSLIST 中看到状态为 Creating sort index 或 Copying to tmp table

GROUP BY 字段没索引,但你以为“有主键就够了”

主键索引只对 GROUP BY primary_key 有效;一旦是 GROUP BY status, created_at 或 GROUP BY YEAR(created_at),主键就完全失效。优化器没法用主键顺序做流式聚合(Stream Aggregate),只能退回到代价更高的 HASH 或 SORT 方式。

实操建议:

  • 联合索引必须严格匹配 GROUP BY 字段顺序:GROUP BY a, b → 建 (a, b),不是 (b, a)
  • 避免在分组字段上用函数:GROUP BY DATE(created_at) 会放弃所有索引;改用生成列:ALTER TABLE t ADD COLUMN created_date DATE AS (DATE(created_at)) STORED,再建索引 (created_date)
  • 确认是否真需要实时分组:大表按天汇总订单,优先考虑物化视图或定时写入汇总表,而非每次查都 GROUP BY DATE(created_at)

SELECT * + GROUP BY = 双倍 CPU 开销

SELECT * 强制回表取所有字段,而 GROUP BY 过程中每分一组都要反复读取这些冗余字段——尤其当表里有 TEXT、JSON 或长 VARCHAR 时,CPU 要花大量时间拷贝、比较、哈希这些大块内存。更糟的是,这会让原本能走覆盖索引的查询彻底失效。

DrugBank 数据库
DrugBank 数据库

访问并分析来自 DrugBank 数据库的全面药物信息,包括药物属性、相互作用、靶点、通路、化学结构和药理学数据。用于药物数据、药物发现研究、药理学研究、药物-

下载

关键参数影响:

  • MySQL 的 tmp_table_size 和 max_heap_table_size 默认 32MB,一旦 GROUP BY 中间结果超限,立刻落盘,触发磁盘排序,CPU 持续满载还带高 IO
  • PostgreSQL 的 work_mem 控制单个排序/哈希操作内存上限,设太小(如 4MB)会导致 external merge Disk,性能断崖下跌
  • 别全局调大这些值——并发一高就 OOM;应定位到具体慢 SQL,用 SET LOCAL work_mem = '64MB' 或加 /*+ SET_VAR(tmp_table_size = 67108864) */ 提示优化器

隐式类型转换让索引彻底失效

比如 user_id 是 BIGINT,但查询写成 WHERE user_id = '123',MySQL 会把所有 user_id 转成字符串再比对,索引直接跳过。更隐蔽的是 GROUP BY 场景:GROUP BY CONCAT('U', user_id) 或 GROUP BY CAST(user_id AS CHAR),同样导致无法使用 user_id 索引,被迫全表扫。

检查方法:

  • 用 EXPLAIN FORMAT=JSON 查 key 字段是否为 null,同时看 filtered 值是否异常低(如 10.0,说明实际只过滤掉 90% 数据,剩下 90% 还得参与分组)
  • 抓出慢日志中的 SQL,用 SELECT @@sql_mode 确认是否启用了 STRICT_TRANS_TABLES,避免隐式转换被静默吞掉
  • 对业务代码中拼接的动态条件做审计:所有传入 GROUP BY 的字段,必须和表定义类型一致,宁可显式 CAST 也不依赖自动转换

真正卡住 GROUP BY 性能的,往往不是聚合逻辑本身,而是分组前的数据输入失控——没 WHERE 过滤、没索引支撑、字段类型不匹配、还顺手 SELECT *。这些问题叠加后,CPU 不是“被用满”,而是“被逼疯”。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

数据库

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4883

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

991

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1289

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6921

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3603

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6920

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9621

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1310

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1152

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
DBeaver生态工具dbvr官方手册
DBeaver生态工具dbvr官方手册

共0课时 | 0人学习

DBeaver AI数据隐私指南
DBeaver AI数据隐私指南

共0课时 | 0人学习