必须显式开启slow_query_log=on并配置slow_query_log_file路径,否则日志不落地;long_query_time设为0可记录所有查询但有i/o风险;log_queries_not_using_indexes=on才能捕获未走索引的隐式慢查询;log_output必须为file才支持标准分析工具。

慢查询日志开关和基础参数必须显式设为 ON
MySQL 默认关闭慢查询日志,即使你改了 long_query_time 也没用。必须同时启用 slow_query_log(动态变量)和指定日志文件路径 slow_query_log_file,否则日志不会落地。
实操建议:
- 在
my.cnf的[mysqld]段下写死:slow_query_log = ON<br>slow_query_log_file = /var/log/mysql/mysql-slow.log<br>long_query_time = 1.0
- 不要依赖
SET GLOBAL slow_query_log = ON—— 重启后失效,且部分 MySQL 版本(如 5.7.20 前)在未配置slow_query_log_file时会静默失败,不报错也不写日志 -
long_query_time单位是秒,支持小数(如0.5),但注意:值设为0会记录所有查询(含SELECT 1这类),对高并发实例有 I/O 风险
必须开启 log_queries_not_using_indexes 才能捕获“隐式慢查询”
很多真实慢查询不是因为执行时间超阈值,而是没走索引导致全表扫描——这类查询可能 Query_time 低于 long_query_time,但实际拖垮系统。默认该选项是 OFF,不打开就漏掉关键线索。
实操建议:
- 追加配置:
log_queries_not_using_indexes = ON
,配合long_query_time = 0可完整覆盖索引缺失场景(调试期可用,上线需评估日志量) - 注意:该选项对
SELECT生效,但对INSERT ... SELECT中的SELECT部分也生效;而纯INSERT/UPDATE/DELETE本身不触发此日志 - 如果启用了
log_throttle_queries_not_using_indexes(8.0.14+),要小心它会限制每分钟记录条数,可能掩盖高频低效查询
MySQL 5.7+ 要确认 log_output 设置为 FILE 才能写入磁盘文件
从 5.7 开始,log_output 默认值是 FILE,但某些云数据库或定制镜像会改成 TABLE(写入 mysql.slow_log 表)。问题在于:TABLE 方式无法用 mysqldumpslow 或 pt-query-digest 直接分析,且表结构固定、字段不可扩展,丢失原始 SQL 格式(比如换行、注释被截断)。
实操建议:
- 检查当前设置:
SHOW VARIABLES LIKE 'log_output';
,如果不是FILE,立即改回:SET GLOBAL log_output = 'FILE';
(并同步写入配置文件) - 若已用
TABLE模式,别直接清空mysql.slow_log表——它受max_slow_log_size限制且无自动轮转,容易撑爆系统表空间 -
slow_query_log_file路径必须 MySQL 进程有写权限,常见坑:路径存在但属主是root,而 mysqld 以mysql用户运行,结果日志文件创建失败且无提示
真实执行流程依赖 long_query_time 计算逻辑而非客户端感知时间
MySQL 的 Query_time 是从语句解析完成、进入执行器开始计时,到返回结果给客户端前结束。它**不包含**网络传输、客户端解析、连接建立等耗时。所以你在应用层测出 2s 的请求,慢日志里可能只记了 800ms——这不是配置错了,是统计口径不同。
实操建议:
- 想对齐应用层耗时,得结合
Lock_time(锁等待)、Rows_sent/Rows_examined(数据量级)一起看:如果Rows_examined远大于Rows_sent,说明过滤效率低;如果Lock_time接近Query_time,大概率是锁争用 -
SET SESSION long_query_time = 0.1对当前连接生效,可用于临时抓取某段业务逻辑的全部查询,但注意:该设置不影响已开启的事务内后续语句的计时起点(仍以语句执行开始为准) - 使用
pt-query-digest分析时,加--since参数限定时间范围,避免混入旧日志干扰判断;它默认按Query_time排序,但可加--order-by 'sum(Copy_to_tmp_table)'快速定位内存临时表大户
最常被忽略的是日志权限和 log_output 模式——两者都无声无息,既不报错也不写日志,查半天发现根本没生成文件。调完配置,务必手动执行一条明显慢的查询(如 SELECT SLEEP(2)),再立刻 tail -f 日志文件确认是否真在写入。











