首页/数据/数据库速查/慢日志阅读与 mysqldumpslow
性能与调优57 条

慢日志阅读与 mysqldumpslow

慢日志是文本流:每条含 Query_time/Lock_time/Rows_sent/Rows_examined 与 SQL;mysqldumpslow 按耗时/次数聚合是官方自带的入门分析器。

数据库速查数据更新于 2026-10-13

慢日志怎么读

慢日志是文本流,每条记录含执行时间、等锁时间、扫描行数、返回行数与原始 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 是参数替换后的原文,可能含手机号、身份证等敏感数据,交接与共享前要脱敏。

易错点

  • 只看单条最慢的语句:漏掉单次不慢但每天执行百万次的累计大户
  • 把等锁时间当成执行时间:真正要优化的是锁竞争,改 SQL 无济于事
  • 长期开着记录未使用索引的语句:日志量暴涨,磁盘被写满
  • 慢日志不做轮转:文件持续增长,排查时打开都困难

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqldumpslow

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌