mysql慢查询日志是定位 性能瓶颈 最直接有效的手段,需合理配置 long_query_time(建议 0.5~2 秒)、验证写入有效性,并通过 mysqldumpslow 或 EXPLai N 分析优化。

MySQL 慢查询日志是定位 性能瓶颈 最直接有效的手段之一。开启它不难,但关键在于配置合理、验证到位、日志可用——尤其要注意 临时设置不持久 和阈值设太大会漏掉真实慢 SQL这两个常见坑。
确认当前状态并检查参数
登录 MySQL 后,先执行以下命令查看慢查询日志是否已启用及当前配置:
- SHOW varIABLES LIKE ‘slow_query_log’; —— 若返回 OFF,说明未开启
- SHOW VARIABLES LIKE ‘slow_query_log_file’; —— 查看日志默认路径(如 /var/lib/mysql/hostname-slow.log)
- SHOW VARIABLES LIKE ‘long_query_time’; —— 默认通常是 10 秒,生产环境建议调低到 0.5~2 秒
- SHOW VARIABLES LIKE ‘log_queries_not_using_indexes’; —— 可选开启,用于捕获未走索引的查询
两种开启方式:临时生效 or 永久生效
临时开启适合测试或紧急排查,修改后立即生效但重启 MySQL 会丢失;永久开启需改 配置文件,适合生产环境。
- 临时开启(无需重启):
SET GLOBAL slow_query_log = ‘ON’;
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = ‘/var/log/mysql/slow.log’;
SET GLOBAL log_queries_not_using_indexes = ‘ON’; - 永久开启(推荐):
编辑 MySQL 配置文件(linux 常为 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf,windows 为 my.ini),在 [mysqld] 段下添加:[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = ON
log_output = FILE保存后重启 MySQL:systemctl restart mysql(或 mysqld)
验证日志是否真正记录
不能只看变量值为 ON 就认为成功——必须实测写入。
- 执行一条“人工慢 SQL”:select SLEEP(2);(确保超过 long_query_time)
- 检查慢查询计数是否增加:SHOW GLOBAL STATUS LIKE ‘Slow_queries’;
- 直接查看日志文件:tail -f /var/log/mysql/slow.log(注意:MySQL 进程需对日志路径有写权限)
- 若用 log_output = table,可查表:SELECT * FROM mysql.slow_log LIMIT 5;
后续分析与优化建议
日志有了,下一步才是重点:
- 用官方 工具 快速汇总:mysqldumpslow -s t -t 10 /var/log/mysql/slow.log(按耗时排序取前 10 条)
- 重点关注 Rows_examined(扫描行数)远大于 Rows_sent(返回行数)的语句,大概率缺索引或条件写法不佳
- 对高频慢 SQL,结合 EXPLAIN 分析执行计划,优先考虑添加复合索引、避免 SELECT *
- 注意:数据量极小时 MySQL 可能主动放弃索引走全表扫描,这类也会被
log_queries_not_using_indexes记录,需结合实际数据量判断是否真有问题