MySQL 占用 CPU50% 以上原因分析 一键优化配置

一、前言
很多宝塔建站服务器,经常遇到 MySQL 占用 CPU 50%、80% 甚至 100%,网站卡顿、打开慢、超时、空白。
多数不是服务器配置太低,而是:默认配置没调、存在大量慢查询、数据表缺索引、并发锁等待 造成。
下面完整分析原因 + 直接可用的一键优化配置,照搬就能把 MySQL CPU 压到正常水平。
二、MySQL 占用 CPU 50% 以上常见原因
大量慢 SQL 无索引
查询没加索引,全表逐行扫描,直接吃满 CPU。
MySQL 默认配置太保守
安装后没改 my.cnf,内存、连接、日志参数都是默认,高并发直接扛不住。
程序 SQL 写法不规范
多表连查、子查询嵌套、like 模糊查询滥用,加重数据库计算压力。
连接不释放、大量 Sleep 进程
程序没正常关闭数据库连接,大量休眠连接堆积,占用资源锁表。
爬虫恶意访问、WordPress 插件冗余
频繁查数据库、统计、日志查询,不停请求 MySQL 拉高 CPU。
数据表碎片过多
长期增删数据产生碎片,查询效率下降、CPU 飙升。
三、临时急救:立刻降低 CPU
现在已经卡、CPU 居高不下,先执行急救:
bash
运行
/etc/init.d/mysql restart
重启会清空卡死进程、死锁、慢查询,瞬间恢复正常。
四、一键优化配置(8G 服务器直接套用)
打开宝塔 → 数据库 → MySQL 配置 → 配置文件 my.cnf
在 [mysqld] 下面直接粘贴以下全套优化参数:
ini
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_read_io_threads = 8
innodb_write_io_threads = 8
max_connections = 300
wait_timeout = 60
interactive_timeout = 60
query_cache_type = 1
query_cache_size = 64M
tmp_table_size = 64M
max_heap_table_size = 64M
open_files_limit = 65535
保存,重启 MySQL 立即生效。
配置简单说明
innodb_buffer_pool_size 给到物理内存 1/4,缓存数据表,大幅减少 CPU 计算
超时缩短,自动清理无用 Sleep 连接
读写线程调高,处理并发更快
开启查询缓存,重复请求直接返回不重新计算
五、开启慢查询日志(找到元凶 SQL)
MySQL 内执行:
sql
set global slow_query_log = ON;
set global long_query_time = 1;
作用:记录执行超过 1 秒的所有 SQL
后续看日志,给对应表加索引、改 SQL,从根源根治 CPU 反复飙高。
六、日常排查命令
查看当前正在跑的数据库任务:
bash
运行
mysql -u root -p -e “SHOW PROCESSLIST;”
查看服务器整体负载:
bash
运行
uptime
top
七、优化后效果
MySQL CPU 从 50%~100% 降到 5%~15%
网站打开速度明显变快,不再卡顿超时
服务器负载回归正常,不会莫名飙高
杜绝死锁、长时间查询、连接堆积问题
八、总结
MySQL CPU 占用过半,90% 不是机器差,是没调配置 + 缺索引 + 慢 SQL 堆积。
先用一键配置压下 CPU,再开慢查询日志找问题语句加索引,就能永久解决。

© 版权声明

相关文章

暂无评论

暂无评论...
本站主题由 OneNav 一为主题强力驱动