mysql慢查询日志默认关闭,必须显式启用;最可靠确认方式是执行select @@slow_query_log, @@slow_query_log_file, @@long_query_time,若@@slow_query_log返回off则日志未生效,后续配置均无效。

MySQL慢查询日志默认是关闭的,必须显式启用并指定日志文件路径,否则即使设置了阈值也不会记录任何查询。
如何确认慢查询日志当前是否启用
直接查系统变量最可靠,slow_query_log 是开关,slow_query_log_file 是日志路径,long_query_time 是阈值(单位秒):
SELECT @@slow_query_log, @@slow_query_log_file, @@long_query_time;
注意:@@slow_query_log 返回 OFF 或 ON,不是 0/1;如果返回 OFF,后续配置都无效。
启用慢查询日志的两种方式
运行时动态开启(重启后失效):
SET GLOBAL slow_query_log = ON;<br>SET GLOBAL long_query_time = 1.0;
永久生效需修改配置文件(如 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),在 [mysqld] 下添加:
slow_query_log = ON-
slow_query_log_file = /var/log/mysql/mysql-slow.log(确保 MySQL 进程有写权限) -
long_query_time = 1.0(支持小数,比如0.5表示 500ms) -
log_queries_not_using_indexes = OFF(慎开,会把没走索引但执行快的查询也记下,日志膨胀快)
为什么查询没被记录?常见原因排查
即使启用了,仍可能漏记,关键点如下:
-
long_query_time是按查询实际执行时间判断,不是客户端等待时间;事务中多个语句各自计时 - 如果使用了查询缓存(已弃用)或结果从缓存返回,
long_query_time不生效(MySQL 8.0+ 已移除查询缓存) - 主从复制中,从库默认不记录慢查询(除非显式设置
log_slow_slave_statements = ON) - 日志文件路径目录不存在或权限不足,MySQL 会静默失败——检查错误日志里是否有
Could not use ... for slow log报错
查看和分析慢查询日志的实用技巧
日志是纯文本,但格式固定,可直接用 mysqldumpslow 快速汇总:
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
常用参数说明:
-
-s t:按总执行时间排序 -
-t 10:只显示前 10 条 -
-g "SELECT":过滤含 SELECT 的语句
注意:mysqldumpslow 会自动归并相似 SQL(参数替换为 N),但无法识别函数调用或子查询结构变化;真正定位问题还得结合 EXPLAIN 和表结构分析。
路径、权限、阈值精度、主从行为——这些地方一动就容易断链,配完别忘了用 SELECT SLEEP(2); 测一下是否真写进去了。











