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

引起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 高 + 锁竞争优化事务、减少锁粒度
http://www.xdnf.cn/news/12604.html

相关文章:

  • Svelte 核心语法详解:Vue/React 开发者如何快速上手?
  • LeetCode刷题 -- 542. 【01 矩阵】最短距离更新算法实现(双向DP)
  • 粤龙庄新文化解释:龙腾南粤,酱蕴山河
  • 计算机网络第2章(下):物理层传输介质与核心设备全面解析
  • 手机号段数据库与网络安全应用
  • Java应用Flink CDC监听MySQL数据变动内容输出到控制台
  • 家政小程序开发——AI+IoT技术融合,打造“智慧家政”新物种
  • 腾讯 ovCompose 跨平台框架发布,几年后还会有人用吗?
  • VScode 使用 git 提交数据到指定库的完整指南
  • TensorFlow深度学习实战(20)——自组织映射详解
  • 【Java开发日记】说一说 SpringBoot 中 CommandLineRunner
  • PyTorch 中contiguous函数使用详解和代码演示
  • 第4章——springboot自动配置
  • LabVIEW音频测试分析
  • ​React Hooks 的闭包陷阱问题
  • YoloV12改进策略:Block改进|TAB,融合组内自注意力(IASA)和组间交叉注意力(IRCA)|即插即用
  • spring:实例工厂方法获取bean
  • 408考研逐题详解:2009年第33题
  • 第22讲、Odoo18 QWeb 模板引擎详解
  • 【PCIe总线】 -- PCI、PCIe相关实现
  • 第十五届蓝桥杯单片机国赛
  • SQL-labs通关(level1-22)
  • 主流信创数据库对向量功能的支持对比
  • Vue Fragment vs React Fragment
  • Mysql-定时删除数据库中的验证码
  • Golang基础学习
  • 性能测试-jmeter实战2
  • 注意力热图可视化
  • Ubuntu 下开机自动执行命令的方法
  • win11无法打开.bat文件、打开.bat文件闪退解决方案,星露谷smapi mod安装时,.bat安装文件一闪而