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 没有用到索引,加了索引后如何确认?
对比优化前后的查询时间和日志变化:

  1. 执行 SHOW PROFILES;(需先开启 SET profiling=1;)或直接看慢日志数量。
  2. 查看 SHOW INDEX FROM table_name; 确认索引已添加。
  3. 重新跑一遍业务,观察慢日志是否不再出现那条查询。

此外还可以用 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 和索引优化。
遇到异常时重读避坑部分,基本能搞定绝大多数场景。

分享到:
上一篇
Nginx日志切割从入门到实战:自动轮转与排错全攻略
下一篇
PHP错误日志排查教程指南实用
1
系统公告

高考专属福利来袭|凭准考证免费领香港 CN2 云服务器

值高考落幕之际,泽御云开启考生专属回馈 + 产品限时特惠双重活动,助力学子暑期学习建站 高考 考生专属福利 全体应届高考生,凭高考准考证即可免费申领【香港 CN2 轻量云服务器,4 核 4G AMD 处理器】,免费使用周期 30 天,可用于搭建个人站点、编程实操、技术实训,祝各位考生金榜题名,前程似锦! 泽御云资质齐全合规自营机房,线路覆盖香港 CN2、国内 BGP、内蒙电信、美国精品线路,售后全天候技术支持。 官方网站:www.zeyuyun.com,活动限时有效,优惠逾期不再保留。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意