慢查询日志是什么
MySQL 把执行时间超过 long_query_time 的语句记进日志文件,是定位慢 SQL 的常规入口。它可以运行时开关,也可以写进配置文件持久化;开启“记录未使用索引的语句”之后日志量会明显增加。
基本信息
| 核心参数 | slow_query_log 开关、slow_query_log_file 路径、long_query_time 阈值 |
|---|---|
| 阈值单位 | 秒,支持小数,例如 0.5 表示 500 毫秒 |
| 未使用索引 | log_queries_not_using_indexes,日志量会显著上升 |
| 噪音过滤 | min_examined_row_limit 过滤扫描行数过少的语句 |
| 生效范围 | SET GLOBAL 重启后失效,可用 SET PERSIST 或写配置文件 |
| 分析工具 | mysqldumpslow 做汇总,或用 pt-query-digest 深度分析 |
运行时开启
运行时开启
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; -- 单位秒,可带小数
SET GLOBAL log_queries_not_using_indexes = ON; -- 未使用索引的语句也记录
SHOW VARIABLES LIKE 'slow_query_log%'; -- 确认开关与日志文件路径
SHOW VARIABLES LIKE 'long_query_time'; -- 确认当前阈值配置文件持久化
配置文件持久化
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
min_examined_row_limit = 100参数与取值
| 参数 | 含义 | 常见取值 |
|---|---|---|
| slow_query_log | 是否开启 | 1 开启,0 关闭 |
| long_query_time | 超过该秒数即记录 | 生产常用 0.5 到 2 |
| log_queries_not_using_indexes | 记录未走索引的语句 | 调试期开启,长期开启会淹掉日志 |
| min_examined_row_limit | 扫描行数低于该值不记录 | 常设 100,过滤小结果集噪音 |
| slow_query_log_file | 日志文件路径 | 按磁盘容量选择挂载点 |
典型使用场景
- 定位线上慢 SQL:先拿到阈值以上的语句清单
- 上线前评估:新功能上线后复查是否引入新的慢查询
- 索引优化前后对比:观察慢查询数量是否下降
- 容量规划:分析大表扫描的出现频率
- 排查某个接口变慢:按时间窗去日志里找对应语句
- 审计异常 SQL:找出高频且没走索引的语句
long_query_time 支持小数,压测阶段可以临时设成 0.1 秒把大部分语句都记下来,排查完再调回正常值。阈值越小日志增长越快,磁盘空间要留足。
长期开启未使用索引的记录会显著增加日志量与磁盘写入,高峰期可能反过来拖慢实例。建议配合 min_examined_row_limit 过滤小结果集,或只在排查期开启。