怎么确认慢查询日志当前没开?
安装完 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,那大概率是锁竞争或大结果集排序,不是简单加个索引能解决的。
