MySQL慢日志开启,定位拖慢网站的SQL语句

网站访问变慢,很多时候是数据库里某条SQL语句执行太久导致的。
MySQL慢查询日志就是用来记录这些“拖后腿”语句的。
这篇文章会带你从零开始开启慢日志,并利用日志找出问题SQL,适合刚接触服务器运维的读者。

先确认环境和权限

操作前,你需要有一个能登录MySQL的账号,最好有SUPERSYSTEM_VARIABLES_ADMIN权限。
登录命令如下:

mysql -u root -p

输入密码后进入MySQL命令行。
可以先用下面命令查看当前慢日志状态:

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';

如果slow_query_logOFF,说明还没开启。long_query_time默认是10秒,表示超过10秒的查询才会被记录。
你可以根据网站情况调整,比如改成2秒。

开启慢日志并设置参数

有两种方式:临时开启(重启失效)和永久生效(修改配置文件)。
推荐永久生效。

临时开启(适合测试):

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

永久生效:编辑MySQL配置文件,通常位于/etc/my.cnf/etc/mysql/my.cnf,在[mysqld]段落下添加:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

log_queries_not_using_indexes会记录未使用索引的查询,方便排查,但可能产生大量日志,建议按需开启。
修改后重启MySQL:

systemctl restart mysqld

然后再次查看变量确认已生效。

分析慢日志,找出问题SQL

慢日志文件是纯文本,直接查看可能很乱。
推荐用mysqldumpslow工具,MySQL自带。
常用命令:

mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

-s t表示按总时间排序,-t 10显示前10条。
想按平均时间排序可以用-s at
输出会显示执行次数、锁定时间、发送行数等信息。

如果觉得mysqldumpslow不够直观,可以安装pt-query-digest(Percona Toolkit),分析更详细:

pt-query-digest /var/log/mysql/slow.log

它会给出每条SQL的响应时间、执行次数、示例等,帮你快速定位最耗时的语句。

避坑指南:这些细节容易出错

  • 日志文件权限:确保MySQL用户对日志目录有写权限,否则慢日志无法生成。
  • long_query_time设置过小:会产生大量日志,占用磁盘,建议从2秒开始,逐步调整。
  • 未使用索引的查询:开启log_queries_not_using_indexes后,日志可能增长很快,分析完可关闭。
  • 日志轮转:长期开启慢日志,文件会变大,建议用logrotate或定期清理。
  • 在线修改参数SET GLOBAL只对当前会话之后的新连接生效,已有连接不受影响。

验证效果与后续优化

开启慢日志后,让网站运行一段时间,然后查看日志文件是否生成并记录。
可以手动执行一条慢查询测试:

SELECT SLEEP(3);

如果long_query_time是2秒,这条语句应该被记录。
tail -f /var/log/mysql/slow.log实时观察。

找到问题SQL后,通常的优化手段包括:添加索引、重写SQL、减少全表扫描、优化表结构等。
可以用EXPLAIN分析执行计划:

EXPLAIN SELECT * FROM 表名 WHERE 条件;

关注type列(最好达到refrange)、key列(实际使用的索引)、rows列(扫描行数)。

结论:慢日志是定位数据库性能问题的第一步,开启后定期分析,能有效发现拖慢网站的SQL。
优化时先看索引,再看SQL写法,最后考虑架构调整。

常见疑问

慢日志会影响性能吗? 会有轻微影响,但通常可忽略。
如果日志量极大,建议只在排查期开启。

为什么开启了慢日志却没有记录? 检查long_query_time是否设置合理,以及查询是否真的超过阈值。
另外,log_queries_not_using_indexes未开启时,未使用索引的查询不会记录。

如何关闭慢日志? 临时关闭:SET GLOBAL slow_query_log = 'OFF';
永久关闭则修改配置文件并重启。

日志文件路径找不到? 默认可能在数据目录下,用SHOW VARIABLES LIKE 'slow_query_log_file';查看确切路径。

按照以上步骤操作,你就能独立完成MySQL慢日志的开启和SQL定位。
遇到异常时,优先检查权限和配置项是否正确。

分享到:
上一篇
Nginx缓存静态资源,减轻PHP与数据库压力
下一篇
MySQL索引优化,CMS文章查询提速
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意