慢日志怎么读
慢日志是文本流,每条记录含执行时间、等锁时间、扫描行数、返回行数与原始 SQL。读它的关键不是找单条最慢的语句,而是看清「扫描行数远大于返回行数」的信号——那几乎总意味着索引缺失或写法不当。自带的聚合工具能按总耗时或出现次数排序,是最省事的入门分析器。
基本信息
| 入口 | slow_query_log 开启后写入 slow_query_log_file 指定文件 |
|---|---|
| 判定阈值 | long_query_time 设置,单位为秒,支持小数 |
| 记录范围 | 可通过 log_queries_not_using_indexes 记录未用索引的语句 |
| 聚合工具 | mysqldumpslow 按耗时、次数或平均耗时排序输出 |
| 增强工具 | pt-query-digest 提供更完整的画像与归并 |
典型使用场景
- 例行性能巡检:按总耗时排序找累计影响最大的语句
- 上线后回归:新版本发布后对比慢查询数量与形态变化
- 索引评估:找出扫描行数异常巨大的语句,评估加索引收益
- 容量分析:高频轻查询即使单次不慢,累计消耗同样值得治理
- 故障复盘:从慢日志时间点反查故障前后的语句形态变化
阅读与聚合
阅读与聚合
tail -200 /var/log/mysql/slow.log # 先看最近记录
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log # 按总耗时前 10
mysqldumpslow -s c -t 10 /var/log/mysql/slow.log # 按出现次数前 10
mysqldumpslow -s at -t 10 /var/log/mysql/slow.log # 按平均耗时前 10
mysqldumpslow -s t -g "SELECT" /var/log/mysql/slow.log | head -60
# 动态调阈值,抓取更细的样本
mysql -e "SET GLOBAL long_query_time = 0.2;"输出逐列读法
| 字段 | 含义 | 判读 |
|---|---|---|
| Query_time | 语句执行总耗时 | 与 Lock_time 一起看才能区分等待与执行 |
| Lock_time | 等待锁的时间 | 占比高说明锁竞争激烈而非语句本身慢 |
| Rows_sent | 返回给客户端的行数 | 与扫描行数对比判断索引效率 |
| Rows_examined | 存储引擎检查的行数 | 远大于返回行数即索引问题 |
| 时间戳与用户 | 发生时间与执行账号 | 便于定位具体应用与变更窗口 |
聚合工具会把不同常量的同类语句归并成模板,因此看到的是模式而不是单条实例,正好适合定位结构性优化点。
慢日志里的 SQL 是参数替换后的原文,可能含手机号、身份证等敏感数据,交接与共享前要脱敏。