MySQL休眠查询与性能缓慢问题排查求助
问题诊断与解决方案
一、客户端请求优化(最立竿见影的降负载手段)
- 降低轮询频率:每秒一次的Ajax请求过于激进,改成每5-10秒轮询一次,或者直接换成WebSocket长连接让服务器主动推送更新。8个用户的情况下,轮询改成10秒一次,查询量直接从80次/秒降到8次/秒,负载能大幅降低90%。
- 合并查询请求:如果一次Ajax对应多次SQL查询,把多个查询合并成单条SQL(比如用JOIN或子查询),减少数据库交互次数。
- 客户端本地缓存:对非实时数据做本地缓存,相同请求直接调用缓存结果,不用每次都发起Ajax请求。
二、MySQL查询与连接优化
- 清理休眠连接:执行
SHOW PROCESSLIST;查看Sleep状态的连接,检查Electron应用是否存在连接泄漏——每次请求后要确保释放数据库连接,或者用连接池统一管理连接,避免闲置连接占用资源。 - 抓慢查询优化:开启慢查询日志定位耗时SQL:
- 在
my.cnf的[mysqld]段添加:slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 1 # 记录耗时1秒以上的查询 - 重启MySQL后,查看慢查询日志,给对应表添加必要索引,优化SQL语句(比如避免
SELECT *,精准过滤数据)。
- 在
- 用连接池控制并发:应用端配置数据库连接池,限制并发连接数(比如Node.js的mysql2模块设置
connectionLimit: 15),避免短时间创建大量连接拖垮数据库。
三、针对你的my.cnf配置调整
- 扩容InnoDB缓冲池:如果服务器内存≥4G,把
innodb_buffer_pool_size改成服务器内存的50%-70%(比如2G)。当前128M太小,InnoDB无法缓存足够数据,每次查询都要读磁盘,直接拉高负载。 - 增大InnoDB日志文件:把
innodb_log_file_size改成256M(不要超过缓冲池的1/4)。当前16M太小,日志切换过于频繁,会额外增加磁盘IO负载。修改后需先停止MySQL,删除旧的ib_logfile0/ib_logfile1,再启动服务。 - 缩短闲置连接超时:把
wait_timeout改成60(60秒),让闲置的休眠连接更快释放,避免占用连接配额。 - 禁用无用的MyISAM配置:如果你的表全部使用InnoDB,注释掉
myisam-recover-options、myisam_sort_buffer_size等MyISAM相关配置,节省服务器资源。
四、服务器负载排查
- 用
top/htop查看CPU、内存、磁盘IO占用:如果磁盘IO高,基本是InnoDB缓冲池太小导致的频繁磁盘读写;如果CPU占用高,大概率是存在无索引的全表扫描查询。 - 监控数据库连接数:执行
SHOW GLOBAL STATUS LIKE 'Threads_connected';,如果数值接近max_user_connections(你的配置是100),说明要么连接数不够,要么存在连接泄漏。
内容的提问来源于stack exchange,提问作者Brian Millot
相关产品推荐
相关产品推荐

