一、什么是 pt-query-digest?
pt-query-digest
是 Percona Toolkit 中的明星工具,用于分析 MySQL 慢查询日志。它能够将庞大的慢日志文件转化为易懂的性能分析报告,帮助DBA快速定位数据库性能瓶颈。
二、安装与配置
安装方法
# CentOS/RHEL
sudo yum install percona-toolkit
# Ubuntu/Debian
sudo apt-get install percona-toolkit
# 使用docker
docker run -it --rm -v $(pwd):/data percona/percona-toolkit pt-query-digest --version
启用MySQL慢查询日志
-- 在MySQL中执行
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- 超过2秒的查询记录
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL log_queries_not_using_indexes = 'ON';
三、基础使用
1. 基本分析
# 最简单的分析
pt-query-digest /var/log/mysql/slow.log
# 输出到文件
pt-query-digest slow.log > slow_report.txt
# 分析最近的文件
pt-query-digest /var/log/mysql/slow.log --since="24h"
2. 排序和限制
# 按执行时间排序,显示前10条
pt-query-digest slow.log --order-by=Query_time:sum --limit=10
# 按锁定时间排序
pt-query-digest slow.log --order-by=Lock_time:sum --limit=5
# 按执行次数排序
pt-query-digest slow.log --order-by=Count:sum --limit=10
3. 过滤特定查询
# 只分析SELECT语句
pt-query-digest slow.log --filter '$event->{arg} =~ m/^SELECT/i'
# 分析特定表的查询
pt-query-digest slow.log --filter '$event->{arg} =~ m/users/i'
# 排除特定用户
pt-query-digest slow.log --filter '$event->{user} !~ m/root/i'
四、中级应用
1. 生成不同类型的报告
# 生成HTML报告
pt-query-digest slow.log --report-format=html > report.html
# 生成JSON格式
pt-query-digest slow.log --report-format=json > report.json
# 详细查询报告
pt-query-digest slow.log --report-format=query_report
2. 时间范围分析
# 分析特定时间范围
pt-query-digest slow.log --since="2025-08-28 00:00:00" --until="2025-08-29 23:59:59"
# 分析最近12小时
pt-query-digest slow.log --since="12h"
# 分析特定时间段(每天9点到18点)
pt-query-digest slow.log --time-range="09:00-18:00"
3. 对比分析
# 两个时间段的对比
pt-query-digest slow.log --since="2025-08-20" --until="2025-08-25" > week1.txt
pt-query-digest slow.log --since="2025-08-26" --until="2025-08-29" > week2.txt
# 使用review模式存储历史数据
pt-query-digest slow.log --review h=localhost,D=monitor,t=query_review
五、高级实战技巧
1. 实时监控分析
# 实时分析当前进程
pt-query-digest --processlist h=localhost --interval 0.01 --print --no-stream
# 监控并只显示慢查询
pt-query-digest --processlist h=localhost --filter '$event->{Time} > 2' --interval 1
2. 高级过滤技巧
# 复合过滤:查询时间大于5秒且扫描行数大于10000
pt-query-digest slow.log --filter '$event->{Query_time} > 5 && $event->{Rows_examined} > 10000'
# 特定数据库和用户
pt-query-digest slow.log --filter '$event->{db} eq "mydb" && $event->{user} eq "app_user"'
# 错误查询分析
pt-query-digest slow.log --filter '$event->{Error} ne ""'
3. 生成可执行的优化建议
# 生成创建索引的建议
pt-query-digest slow.log --report-format=query_report --filter '$event->{Rows_examined} > 100000' | grep -A5 -B5 "SELECT\|UPDATE\|DELETE"
4. 与Explain结合分析
# 提取需要分析的SQL语句
pt-query-digest slow.log --order-by=Query_time:sum --limit=5 --output=slow_queries.sql
# 然后手动执行EXPLAIN分析
mysql -e "EXPLAIN SELECT * FROM users WHERE created_at > '2025-01-01';"
六、解读分析报告
报告关键指标解读
# Overall: 308.93k total, 300 unique, 0.03 QPS, 0.15x concurrency
# Time range: 2025-05-15T17:37:29 to 2025-08-29T09:19:39
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 1384350s 3s 4979s 4s 6s 13s 4s
# Lock time 230s 0 14s 743us 144us 61ms 103us
# Rows sent 33.29M 0 2.37M 113.00 487.09 8.40k 0.99
# Rows examine 629.53G 0 259.56M 2.09M 2.26M 1.90M 1.95M
- Exec time: 查询执行时间,关注max和95%值
- Rows examine: 扫描行数,值过大说明索引问题
- Rows sent: 返回行数,与扫描行数比值越小越好
- Lock time: 锁等待时间,过高可能有锁竞争
七、实战案例
案例1:分析并优化慢查询
# 1. 找出最耗时的查询
pt-query-digest slow.log --order-by=Query_time:sum --limit=3
# 2. 查看具体查询的执行计划
pt-query-digest slow.log --filter '$event->{fingerprint} =~ m/SELECT.*users/' --output=explain_queries.sql
# 3. 生成优化建议
案例2:监控生产环境实时性能
#!/bin/bash
# realtime_monitor.sh
while true; do
echo "=== $(date) ==="
pt-query-digest --processlist h=localhost \
--filter '$event->{Time} > 2' \
--order-by=Time:max \
--limit=5
sleep 30
done
案例3:每日性能报告
#!/bin/bash
# daily_report.sh
DATE=$(date +%Y%m%d)
REPORT_FILE="/tmp/mysql_report_$DATE.html"
pt-query-digest /var/log/mysql/slow.log \
--since="24h" \
--report-format=html \
> $REPORT_FILE
# 发送邮件报告
mail -s "MySQL Daily Report $DATE" dba@company.com < $REPORT_FILE
八、常见问题排查
1. 内存不足处理
# 分析大文件时使用分段处理
pt-query-digest slow.log --memory-limit=1G --chunk-size=100000
2. 网络分析
# 分析远程数据库
pt-query-digest --processlist h=db-prod.example.com,u=monitor,p=password --interval=5
3. 批量处理多个文件
# 分析多个慢日志文件
pt-query-digest /var/log/mysql/slow.log*
九、最佳实践
- 定期分析:设置每天自动分析慢日志
- 建立基线:保存历史报告用于对比
- 重点关注:95%百分位的值比平均值更重要
- 结合监控:与Prometheus、Grafana等监控系统结合
- 团队协作:将报告分享给开发团队共同优化
十、总结
pt-query-digest
是MySQL性能优化不可或缺的工具。从简单的日志分析到复杂的性能监控,它都能提供有价值的见解。掌握这个工具,你就能:
- ✅ 快速定位性能瓶颈
- ✅ 识别缺失的索引
- ✅ 优化低效的SQL查询
- ✅ 监控数据库健康状态
- ✅ 提升整体系统性能
开始使用 pt-query-digest,让你的数据库性能优化事半功倍!