欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > MySQL 慢查询日志深入分析与工具实战(mysqldumpslow pt-query-digest)

MySQL 慢查询日志深入分析与工具实战(mysqldumpslow pt-query-digest)

2025/4/26 0:25:53 来源:https://blog.csdn.net/weixin_52779958/article/details/147286477  浏览:    关键词:MySQL 慢查询日志深入分析与工具实战(mysqldumpslow pt-query-digest)

🎯 学习目标
• ✅ 熟悉慢查询日志结构与核心字段
• ✅ 掌握日志开启与 SQL 记录机制
• ✅ 使用 pt-query-digest 工具进行分析
• ✅ 解读分析结果并提出优化建议
📂 基本概念

项目        内容说明
功能        记录执行时间超过阈值的 SQL
启动参数        slow_query_log=ON, long_query_time=1
默认路径        /var/lib/mysql/xxx-slow.log
适用场景        SQL 优化、性能调优、发现执行瓶颈

简易汇总慢查询模板
mysqldumpslow -s t -t 10 /path/to/slow.log
深度分析工具
pt-query-digest /path/to/slow.log

✅ 第一步:怎么看懂分析报告的结构?

pt-query-digest 的输出可以分为 3 大部分:

1️⃣ 总览 Summary(整个日志的全局统计)

Overall: 2 total, 2 unique, 0.00 QPS
Time range: 2025-04-08T15:28:06 to 2025-04-08T16:35:03
  • 2 total:日志中包含 2 次慢查询
  • 2 unique:其中每条查询 SQL 都是不同的
  • QPS:查询频率(这里非常低,0)

2️⃣ Attribute 分析(汇总每个字段的统计信息)

Attribute          total     min     max     avg
Exec time             5s      2s      3s      2s
Rows sent        278.08k       1  278.08k  139.04k
Rows examine     278.08k       1  278.08k  139.04k
字段意义
Exec time查询执行时间(最核心指标)
Rows sent结果中实际返回了多少行(越多越危险)
Rows examine查询过程扫了多少行,是判断是否走索引的重要指标

3️⃣ Query Profile(重点来了)


Rank Query ID                            Response time Calls R/Call V/M 
==== =================================== ============= ===== ====== ====
1 0xA373CAF4...  2.9623s 59.7%   12.96s/V/M = 0
2 0x59A74D08...  2.0003s 40.3%   12.00s/V/M = 0
  • Rank:表示排序优先级(执行总时间从高到低)
  • Query ID:查询的 hash ID(可忽略)
  • Response time:此类 SQL 总共用了多长时间
  • Calls:调用次数
  • R/Call:每次平均执行时间
  • V/M:变异性指数(越大表示执行时间不稳定)

✅ 第二步:如何判断慢 SQL 的“危险程度”?

根据指标分析(索引,字段(内存),where 过滤条件,limit分页)

✅ 第三步:如何定位这类问题场景?

1️⃣ 问自己:“这条 SQL 是否出现在生产代码中?”

  • 是测试?没问题

  • 是线上代码?⚠️ 高风险!

2️⃣ 用 EXPLAIN 分析执行计划

列名意义
type如果是 ALL,代表全表扫描 ❌
key如果是 NULL,说明没用索引 ❌
rows扫描的预计行数,越大越

✅ 第四步:怎么优化?

问题类型优化方法
SELECT *替换为只查询所需字段:SELECT id, name
无 WHERE加上过滤条件:WHERE status = ‘active’
无索引为 WHERE 使用的字段建立索引
没有分页用 LIMIT 控制结果数量

🧾 小结:阅读 pt-query-digest 的四步法

步骤
1️⃣ 看总览:日志量、执行范围
2️⃣ 看 Top Query:哪个 SQL 最慢
3️⃣ 看扫行数 vs 返回行数 → 判断是否走索引
4️⃣ 用 EXPLAIN 再配合分析是否优化过

扩展

场景推荐配置
日常监控慢 SQL开启 slow_query_log=ON,long_query_time=10
优化阶段,想抓尽可能多的问题将 long_query_time=0.1,并设 log_queries_not_using_indexes=ON
生产环境长期使用slow_query_log=ON,long_query_time=1,其余视场景设
默认 10s
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

生效时间

使用 set global slow_query_log=on; 设置值(重启后就失效了) 写入 配置文件可以解决

🔧 常用排序参数-s后的值)

mysqldumpslow -s t -t 10 /path/to/slow.log

参数排序依据场景适用
t总执行时间哪些 SQL 总耗时最长
l锁等待时间哪些 SQL 锁住资源时间最长
r执行次数哪些 SQL 执行得最多
c返回行数哪些 SQL 导致了最多数据返回
al平均锁等待时间哪些 SQL 平均锁得最久
at平均执行时间哪些 SQL 单次平均执行最耗时

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词