先确认slow_query_log=on、slow_query_log_file路径可写、long_query_time设为0.5~1秒;再用mysqldumpslow -s at -t 10分析日志,关注query_time、lock_time、rows_examined;结合explain、show index、analyze table和强制索引验证优化效果,并监控handler_read_*变量变化。

怎么确认 MySQL 慢查询日志真的在记录
很多人的 slow_query_log 看似开启,实际没写入任何内容——根本原因是日志路径不可写,或 long_query_time 设得太高(比如默认 10 秒),线上业务里压根触发不了。
先检查真实状态:
mysql -e "SHOW VARIABLES LIKE 'slow_query_log'; SHOW VARIABLES LIKE 'slow_query_log_file'; SHOW VARIABLES LIKE 'long_query_time';"
关键点:
-
slow_query_log必须是ON,不是1或空字符串 -
slow_query_log_file路径需被mysqld进程用户(通常是mysql)可写,常见坑是路径在/var/log/mysql/但目录权限不对 -
long_query_time建议调到0.5或1先抓样本,查完再调回;注意:该值对微秒级精度敏感,5.7+ 支持小数,5.6 只认整数 - 如果用的是 MariaDB,还要确认
log_slow_filter没过滤掉你关心的语句类型(比如admin或filesort)
怎么从慢日志里快速定位“真慢 SQL”而不是噪音
原生日志里大量重复的 Connect、Quit、心跳检测语句,还有带随机参数的预编译语句,直接 cat 或 grep 效率极低。
推荐用 mysqldumpslow 预处理:
mysqldumpslow -s at -t 10 /var/log/mysql/mysql-slow.log
说明与要点:
-
-s at按平均执行时间排序,比按总时间(-t)更反映单条语句质量 -
-t 10只看前 10 条,避免被海量低频长尾淹没 - 注意
mysqldumpslow会自动归并带问号参数的语句,但对字符串字面量(比如'2024-01-01')不归并,容易漏判;此时改用pt-query-digest(Percona Toolkit)更稳 - 别只盯
Query_time,同步看Lock_time和Rows_examined:前者高说明锁争用严重,后者远大于Rows_sent就是典型扫描过多(比如没走索引或索引失效)
为什么 EXPLAIN 看着有索引,SQL 还是慢
EXPLAIN 显示 type=ref、key=idx_user_id,不代表真快——可能索引区分度极低(比如性别字段),也可能统计信息过期导致优化器选错执行计划。
实操时必须补这三步:
- 用
SHOW INDEX FROM table_name确认索引字段顺序,联合索引中WHERE a=1 AND b=2能用上(a,b),但WHERE b=2就完全失效 - 执行
ANALYZE TABLE table_name更新统计信息,尤其在大批量导入后,否则优化器仍按旧分布估算行数 - 对疑似问题语句加
/*+ USE_INDEX(table_name idx_name) */(MySQL 8.0.19+)或FORCE INDEX强制走索引,验证是否真因索引选择错误 - 警惕隐式类型转换:
user_id是BIGINT,但WHERE user_id = '123'会导致索引失效(字符串 vs 数字),EXPLAIN的type会降为ALL
优化后怎么验证效果不是假阳性
改完索引或 SQL,直接看慢日志“变少”不靠谱——可能只是流量低谷,或日志轮转清空了旧文件。
必须做两件事:
- 在业务低峰手动复现原 SQL,用
SELECT SLEEP(0.1)模拟延时,确保它能进当前慢日志(比如把long_query_time临时设成0.05) - 上线后盯紧
information_schema.PROFILING(需先SET profiling = 1)或 Performance Schema 的events_statements_history_long,抓真实执行耗时分布,而非仅依赖日志阈值 - 监控
Handler_read_*状态变量:优化后Handler_read_next(索引遍历)应上升,Handler_read_rnd_next(随机磁盘读)应明显下降,否则还是在回表或全表扫
最常被跳过的动作:没关掉测试时临时调低的 long_query_time,结果正式环境狂打日志撑爆磁盘。记得改完立刻核对配置文件和运行时变量是否一致。











