MySQL慢日志分析实战:三步定位慢查询瓶颈
为什么要做 MySQL 慢日志分析
MySQL 运行久了,总有一些 SQL 语句拖慢整体响应。
慢查询日志(slow query log)就是记录这些执行时间超过阈值的 SQL。
分析慢日志能让你精准找到“罪魁祸首”,从而决定要不要加索引、改 SQL 结构或调整数据库参数。
对于网站站长和运维新手,学会看慢日志比瞎猜问题有效得多。
开启慢查询日志(准备)
第一步:确认当前状态
登录 MySQL 后执行:
SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time';
如果 slow_query_log 显示 OFF,说明日志没开。long_query_time 是阈值(秒),默认 10 秒。
对于大多数业务,建议设为 1 到 2 秒。
第二步:临时开启(重启失效)
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;
第三步:永久生效
找到 MySQL 配置文件(Linux 通常为 /etc/my.cnf 或 /etc/mysql/my.cnf),在 [mysqld] 段添加:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
log_queries_not_using_indexes 会记录所有没用索引的查询,即使执行时间小于阈值。
改完重启 MySQL 服务。
使用工具分析慢日志(操作)
日志开启后,手动制造一次慢查询来测试(例如 SELECT SLEEP(2)),然后查看日志文件:
sudo tail -50 /var/log/mysql/mysql-slow.log
你会看到类似: # Query_time: 2.000...。
用系统自带 mysqldumpslow 快速统计
mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
-s c:按查询次数排序-t 10:只显示前 10 条
这条命令会帮你总结“出现最频繁的慢查询”,是入门最实用的工具。
用 Percona Toolkit 的 pt-query-digest 做深度分析
如果服务器装了 Percona Toolkit,可以用它生成更详细报告:
pt-query-digest /var/log/mysql/mysql-slow.log > /tmp/slow_report.txt
打开报告你会看到:总耗时、单个 SQL 的响应时间分布、查询样本等。
特别关注 # Profile 部分,按响应时间占比排序,一眼就知道哪个查询最耗资源。
常见避坑说明
1. 日志文件过大撑爆磁盘
建议定期轮转日志或设置过期策略。可以在配置文件中打开 log_slow_admin_statements 等选项,根据实际需要控制记录范围。用 logrotate 自动切割是标准做法。
2. 不用的查询别开启不必要的日志
生产环境如果排查结束,记得关闭慢日志(SET GLOBAL slow_query_log = OFF),否则持续写日志会影响性能。
3. long_query_time 单位是秒,不是毫秒
如果你希望记录超过 500 毫秒的查询,需要设置为 0.5。
4. 日志文件权限问题
确保 MySQL 用户(通常为 mysql)对日志目录有写权限,否则启动后会报错。
验证优化效果
假设你分析出某条 SELECT 没有用到索引,加了索引后如何确认?
对比优化前后的查询时间和日志变化:
- 执行
SHOW PROFILES;(需先开启SET profiling=1;)或直接看慢日志数量。 - 查看
SHOW INDEX FROM table_name;确认索引已添加。 - 重新跑一遍业务,观察慢日志是否不再出现那条查询。
此外还可以用 EXPLAIN 确认索引使用情况:
EXPLAIN SELECT * FROM table WHERE ...
高频问题解答
Q:慢日志里出现了很多 SELECT SLEEP(...) 怎么办?
可能是你手工测试留下的,不用紧张,正常业务中不会出现。检查应用代码是否有慢请求。
Q:我没有服务器 root 权限,能开慢日志吗?
只要 MySQL 用户有 GLOBAL 权限就可以临时开启,但配置文件修改需要系统 root。可以联系管理员开通。
Q:pt-query-digest 报错找不到模块?
需要安装 Percona Toolkit,命令:sudo apt install percona-toolkit(Ubuntu)或 sudo yum install percona-toolkit(CentOS)。
如果你正在解决数据库慢的问题,强烈建议按本文步骤从慢日志入手,先用 mysqldumpslow 找出高频慢查询,再结合 EXPLAIN 和索引优化。
遇到异常时重读避坑部分,基本能搞定绝大多数场景。