慢查询日志不生效的三大原因是:slow_query_log未开启(必须为on)、log_output未设为file或table、long_query_time未正确配置且新会话才生效。

慢查询日志不记录,大概率是这三个地方没对
不是配置写了就生效,MySQL 对慢日志的启用有「开关+输出路径+阈值」三重校验,缺一不可。常见现象是:明明 set global slow_query_log='ON' 了,但 select sleep(5) 还是没进日志——往往卡在其中一环。
-
slow_query_log是总开关,必须为ON(注意不是1或true); -
log_output决定日志往哪写,默认是NONE,得显式设成FILE或TABLE; -
long_query_time是浮点数,设set global long_query_time=1后,新连接才生效,当前会话仍用旧值(可执行SELECT @@long_query_time确认)。
Windows 下 my.ini 配置后不生效?重启服务只是第一步
Windows 上改完 my.ini,很多人只记得 net start mysql,却忽略了 MySQL 服务加载的是哪个配置文件。尤其当存在多个 my.ini(比如 C:\Windows\my.ini 和 MySQL 安装目录下的),它可能根本没读你改的那个。
- 启动时加参数验证:
mysqld --print-defaults能看到实际加载的配置路径; -
slow_query_log_file路径必须用正斜杠或双反斜杠,比如slow_query_log_file="D:/MySQL/logs/mysql-slow.log",单反斜杠会被当转义符吃掉; - 确保该目录对
mysql用户(服务运行账户)有写权限,否则日志文件创建失败,也不报错,静默丢弃。
Linux 下临时开启后查不到日志?先盯住 log_output 和 slow_query_log_file
临时设置(SET GLOBAL)看起来方便,但容易忽略两个关键变量的联动:
-
log_output默认是NONE,哪怕slow_query_log=ON,日志也无处落脚; -
slow_query_log_file如果没显式设置,MySQL 会按规则自动生成路径(如/var/lib/mysql/hostname-slow.log),但这个路径可能不在你预期位置,甚至因权限问题无法写入; - 用
SHOW VARIABLES LIKE 'slow_query_log_file'查到的路径,务必手动ls -l确认文件是否存在、属主是否为mysql、目录是否可写。
为什么 select sleep(3) 没进日志?long_query_time 的精度和会话隔离性
long_query_time 不是“超过 X 秒就记”,而是“执行时间 ≥ X 秒才记”,且单位是秒,支持小数(如 0.1),但要注意它的作用域:
- 全局设置
SET GLOBAL long_query_time = 0.1只影响后续新建连接,当前会话仍用旧值; - 如果连接已存在,需在该会话内再执行一次
SET SESSION long_query_time = 0.1才能立刻生效; -
sleep()是函数调用,耗时算在 SQL 执行时间内;但像SELECT NOW(), SLEEP(3)这种组合,部分版本可能只统计非 sleep 部分——稳妥起见,单独测SELECT SLEEP(3)。
最常被忽略的一点:log_queries_not_using_indexes 开启后,即使查询很快,只要没走索引也会进慢日志——如果你发现一堆毫秒级查询出现在日志里,先检查这个开关是不是误开了。











