MySQL慢日志开启,定位拖慢网站的SQL语句
网站访问变慢,很多时候是数据库里某条SQL语句执行太久导致的。
MySQL慢查询日志就是用来记录这些“拖后腿”语句的。
这篇文章会带你从零开始开启慢日志,并利用日志找出问题SQL,适合刚接触服务器运维的读者。
先确认环境和权限
操作前,你需要有一个能登录MySQL的账号,最好有SUPER或SYSTEM_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_log是OFF,说明还没开启。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列(最好达到ref或range)、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定位。
遇到异常时,优先检查权限和配置项是否正确。