当前位置: 首页 > news >正文

引起MySQL CPU 使用率过高常见因素和解决方案

MySQL CPU 使用率过高可能的因素及解决方案


🚨 常见引起 MySQL CPU 过高的因素

因素描述是否会引起 CPU 高
慢查询大量慢 SQL 占用资源✅ 是
全表扫描查询未使用索引✅ 是
排序/分组操作ORDER BYGROUP BYDISTINCT✅ 是
JOIN 操作复杂多表连接或无索引关联✅ 是
临时表频繁使用CREATE TEMPORARY TABLE 或内存不足时磁盘临时表✅ 是
子查询效率低特别是无法优化的嵌套子查询✅ 是
锁竞争行锁、表锁等待导致并发阻塞❗可能间接引发 CPU 上升(大量重试)
配置不合理如缓冲池过小、并发连接数过高✅ 是
查询缓存失效(MySQL 8.0 已移除)不合理使用导致频繁失效和重建⚠️ 可能
大量短连接创建销毁连接消耗资源✅ 是
数据库并发压力大高并发请求下处理不过来✅ 是

🔍 详细分析与解决方案

1. 慢查询 / 全表扫描

  • 表现:

    • SHOW PROCESSLIST; 中出现大量 Sending data 状态。
    • EXPLAIN 显示 [type=ALL](file:///Users/bjsttlp200/tech_code/excalibur/public-service/public-provider/src/main/java/com/ty/pt/enums/RoleType.java#L9-L9) 或 Using filesort
  • 解决办法:

    • 添加合适的索引。
    • 优化 SQL 结构,避免 SELECT *
    • 使用覆盖索引减少回表。

2. 排序 & 分组操作

  • 表现:

    • 出现 Using filesortUsing temporary
  • 解决办法:

    • ORDER BYGROUP BY 字段加索引。
    • 尽量避免在大结果集上进行排序。
    • 合理设置 sort_buffer_sizejoin_buffer_size

3. JOIN 操作复杂

  • 表现:

    • 多张大表关联,执行计划显示多次扫描。
  • 解决办法:

    • 确保关联字段有索引。
    • 避免多层嵌套 JOIN。
    • 考虑数据冗余或拆分逻辑。

4. 临时表使用频繁

  • 表现:

    • 执行计划中出现 Using temporary
    • 内存临时表转为磁盘临时表(性能下降明显)。
  • 解决办法:

    • 优化查询逻辑,减少中间结果。
    • 设置更大的 tmp_table_sizemax_heap_table_size
    • 避免对大表做 DISTINCTGROUP BY

5. 子查询效率低

  • 表现:

    • 子查询嵌套层级深,无法命中索引。
  • 解决办法:

    • 改写为 JOIN 查询。
    • 使用物化视图或中间表预计算。

6. 锁竞争严重

  • 表现:

    • 多个线程处于 Waiting for table metadata lock
    • SHOW ENGINE INNODB STATUS 中出现死锁日志。
  • 解决办法:

    • 缩短事务执行时间。
    • 避免长事务或批量更新。
    • 适当调整 innodb_lock_wait_timeout

7. 配置不合理

  • 关键参数建议:
参数名建议值(根据机器配置调整)
innodb_buffer_pool_size物理内存的 50%~80%
query_cache_type / query_cache_sizeMySQL 8.0 已移除,不建议使用
thread_cache_size根据连接数动态调整
table_open_cache提高打开表的缓存数量
tmp_table_size / max_heap_table_size提高以支持更大内存临时表

8. 大量短连接

  • 表现:

    • Threads_created 持续增长。
    • SHOW STATUS LIKE 'Threads_created';
  • 解决办法:

    • 使用连接池(如 Druid、HikariCP)。
    • 调整 thread_cache_size

9. 数据库并发压力大

  • 表现:

    • SHOW STATUS LIKE 'Threads_running'; 数值持续偏高。
    • CPU 持续接近 100%。
  • 解决办法:

    • 限流降级前端请求。
    • 读写分离,引入从库。
    • 使用缓存(如 Redis)减少 DB 请求。

🛠️ 常用排查命令

-- 查看当前活跃线程
SHOW FULL PROCESSLIST;-- 查看系统状态
SHOW STATUS;-- 查看 InnoDB 状态
SHOW ENGINE INNODB STATUS;-- 查看慢查询日志是否开启
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';-- 查看线程运行情况
SHOW STATUS LIKE 'Threads_running';
SHOW STATUS LIKE 'Threads_created';

✅ 总结建议

场景建议措施
CPU 高 + 查询慢优先优化 SQL、加索引
CPU 高 + 并发高引入缓存、读写分离
CPU 高 + 配置低调整 buffer pool、连接池
CPU 高 + 锁竞争优化事务、减少锁粒度

相关文章:

  • ngx_stream_geo_module在传输层实现高性能 IP Region 路由
  • sqlsugar WhereIF条件的大于等于和等于查出来的坑
  • Mysql批处理写入数据库
  • Oracle 19c RAC集群ADG搭建
  • C#报价系统陈列展示成本核算系统项目管理系统纸品非纸品报价软件
  • [论文阅读] 人工智能 | 搜索增强LLMs的用户偏好与性能分析
  • 解密LSTM(长短期记忆网络):让机器拥有记忆力的魔法网络
  • 20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决
  • 【MySQL】视图、用户管理、MySQL使用C\C++连接
  • 【Oracle】数据仓库
  • Android音频开发:Speex固定帧与变长帧编解码深度解析
  • Android 蓝牙通信
  • clickhouse 和 influxdb 选型
  • Clickhouse统计指定表中各字段的空值、空字符串或零值比例
  • 性能优化笔记
  • 【生活】程序员防猝si指南
  • Python Day44 学习(日志Day12复习)
  • 2024 CKA题库+详尽解析| 15、备份还原Etcd
  • 开疆智能Ethernet/IP转Modbus网关连接MAG8000电池流量计配置案例
  • WPF学习PropertyChanged
  • 用织梦系统做的2个网站要把它都上传到服务器上吗/seo自动点击排名
  • 网站内怎样做关键词有效果/免费发广告的网站
  • 服装公司网站建设策划书/2023年6月疫情恢复
  • 佛山龙江做网站的/怎么写软文推广
  • 海阳网站建设/企业网站建设的基本流程
  • 24 手表网站/百度搜索收录入口