执行show variables like 'slow_query_log';若返回off则未开启,需通过set global临时启用或修改配置文件永久开启。

怎么确认慢查询日志当前没开?
安装完 MySQL 默认是关闭慢查询日志的,slow_query_log 值为 OFF。别猜,直接连上 MySQL 执行:SHOW VARIABLES LIKE 'slow_query_log';
如果返回 Value 是 OFF,那就得手动开;顺手再查下阈值:SHOW VARIABLES LIKE 'long_query_time';,默认是 10 秒——对现代业务来说太宽松了,基本等于没开。
临时开启:快速验证是否生效
适合刚装好想立刻测试,或临时排查问题。执行三条命令即可:
SET GLOBAL slow_query_log = 'ON';-
SET GLOBAL long_query_time = 1;(建议先设成 1 秒,比默认 10 秒更敏感) -
SET GLOBAL log_queries_not_using_indexes = 'ON';(可选但强烈推荐,能抓到“没走索引”的隐患 SQL)
注意:SET GLOBAL 只影响新建立的连接,已存在的连接不会自动继承;且服务重启后全部失效。验证是否写入日志,可执行:SELECT SLEEP(2);,然后去日志文件里搜这句——别只看命令回显,要看日志落盘才算真生效。
永久开启:改配置文件 + 重启服务
Windows 下找 my.ini,Linux/macOS 下找 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf,在 [mysqld] 段落下加这几行:
[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = 1 log_output = FILE
关键点:
-
log_output必须显式设为FILE,否则即使开了日志,也可能默默写进表(mysql.slow_log),而你根本不知道它在哪; -
slow_query_log_file路径要确保 MySQL 进程有写权限,尤其 Linux 上常因权限不足导致日志“静默失败”; - 改完必须重启 MySQL 服务,Windows 用
net stop mysql && net start mysql,Linux 用systemctl restart mysqld。
日志怎么看?别用手翻
日志文件本身是纯文本,但直接打开看效率极低。优先用 MySQL 自带工具:mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
这条命令按总耗时(-s t)倒序,取前 10 条最慢的 SQL。常见坑:
- 日志里可能包含大量
SELECT SLEEP(...)测试语句,干扰判断,上线前记得关掉测试配置; - 如果看到大量
Rows_examined极高、但Rows_sent很小的 SQL,基本就是缺索引或写了SELECT *+WHERE条件不匹配索引; -
log_queries_not_using_indexes开启后,会记录所有未走索引的查询——哪怕它本身很快,也得检查,因为数据量一涨就崩。
真正难的不是开日志,而是从日志里区分“偶发抖动”和“结构性瓶颈”。比如一条 SQL 平均 800ms,但 P95 是 3s,那大概率是锁竞争或大结果集排序,不是简单加个索引能解决的。











