pt-query-digest工具可以通过慢查询日志、普通查询日志、binlog对MySQL中的查 询语句进行分析,也可以通过SHOW PROCESSLIST语句输出信息,以及tcpdump 抓取的 MySQL协议数据对MySQL中的查询语句进行分析。
官方文档: https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html
ps:个人来说还是倾向于将慢日志记录到 slow_log表中去的
解析慢查询日志
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log > slow_report.log
输出结果分为3部分
第一部分
汇总信息
[root@VM_0_9_centos ~]# more slow_report.log
# 230ms user time, 20ms system time, 26.35M rss, 220.76M vsz # CPU和内存使用信息
# Current date: Wed Aug 26 15:44:46 2020 # 当前时间
# Hostname: VM_0_9_centos # 主机名
# Files: /var/lib/mysql/VM_0_9_centos-slow.log # 输入的慢日志路径
## 整个分析结果的汇总信息
# Overall: 258 total, 37 unique, 0.02 QPS, 0.00x concurrency _____________
# Time range: 2020-08-26T11:20:16 to 2020-08-26T15:44:11
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 7s 249us 5s 26ms 4ms 311ms 657us
# Lock time 349ms 0 152ms 1ms 348us 12ms 194us
# Rows sent 33.01k 0 9.77k 131.03 755.64 742.92 0.99
# Rows examine 93.32k 0 9.77k 370.38 874.75 775.00 54.21
# Query size 51.71k 15 7.23k 205.23 223.14 615.30 143.84
- Overall:总共有多少个查询,该例总共有2.58k(2580)个查询。
- Time range:查询执行的时间范围。注意,MySQL5.7版本中的时间格式不同于之 前的版本。
- Unique:唯一查询数量,即对查询条件进行参数化以后,总共有多少个不同的查 询。该例为10个。
- Attribute:如上述代码段所示,表示Attribute列描述的Exec time、Lock time等属性 名称。
* total:表示Attribute列描述的Exec time、Lock time等属性的统计数值。
* min:表示Attribute列描述的Exec time、Lock time等属性的最小值。
* max:表示Attribute列描述的Exec time、Lock time等属性的最大值。
* avg:表示Attribute列描述的Exec time、Lock time等属性的平均值。
* 95%:表示Attribute列描述的Exec time、Lock time等属性的所有值从小到大排 列,然后取位于95%位置的那个数值(需要重点关注这个值)。
* stddev:标准偏差,用于数值的分布统计。
* median:表示Attribute列描述的Exec time、Lock time等属性的中位数,即把所有 值从小到大排列,取位于中间的那个数值
第二部分
对查询进行参数化并分组,然后对各类查询的执行情况进行分析,结果按总执行时间从大到小排列
# Profile
# Rank Query ID Response time Calls R/Call V/M It
# ==== =============================== ============= ===== ====== ===== ==
# 1 0x59A74D08D407B5EDF9A57DD5A4... 5.0003 73.7% 1 5.0003 0.00 SELECT
# 2 0x64EF0EA126730002088884A136... 0.9650 14.2% 2 0.4825 0.01
# 3 0x5E1B3DE19F673369DCF52FE6A5... 0.3174 4.7% 2 0.1587 0.00 INSERT data_million_a
# 4 0x3992A499999D8F9E3ACC220E0F... 0.1334 2.0% 1 0.1334 0.00 ALTER TABLE dtb_table_size `dtb_table_size`
# 5 0x66CAA645BA3ED5433EADC39CCA... 0.0991 1.5% 2 0.0495 0.08 SELECT data_million_a
# MISC 0xMISC 0.2735 4.0% 250 0.0011 0.0 <32 ITEMS>
- Rank:为查询生成的数字编号,表示该分类语句在整个分析结果集中的排名。
- Query ID:为查询生成的随机字符串ID(根据指纹语句生成的checksum随机字符串)。
- Response time:该查询的总的响应时间和占所有查询的总的响应时间的百分比。
- Calls:该查询的执行次数,即本次分析总共有多少条这种类型的查询语句。
- R/Call:该查询平均每次执行的响应时间。
- V/M:响应时间的方差与均值的比值。
- Item:具体的查询语句对象(标准化格式转换的语句形式:去掉了具体的select字段和表名、where条件等)
第三部分
按照语句执行的总时间,从大到小依次打印每条语句的相关统计信息
# Query 1: 0 QPS, 0x concurrency, ID 0x59A74D08D407B5EDF9A57DD5A41825CA at byte 0
# Scores: V/M = 0.00
# Time range: all events occurred at 2020-08-26T11:20:16
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 0 1
# Exec time 73 5s 5s 5s 5s 5s 0 5s
# Lock time 0 0 0 0 0 0 0 0
# Rows sent 0 1 1 1 1 1 0 1
# Rows examine 0 0 0 0 0 0 0 0
# Query size 0 15 15 15 15 15 0 15
# String:
# Hosts localhost
# Users root
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s ################################################################
# 10s+
# EXPLAIN /*!50100 PARTITIONS*/
select sleep(5)\G
- Time range:查询执行的时间范围。注意,MySQL5.7版本中的时间格式不同于之 前的版本。
- Attribute:如上述代码段所示,表示Attribute列描述的Count、Exec time、Lock time等属性名称。
- pct:表示该分组语句(这里指上述代码段中“Query 1”代表的分组语句,具体的语 句样本在EXPLAIN ...关键字下面有输出。另外,在上述代码段中,如total、min等计算值
都是针对该语句分组的,下文中不再赘述)的total值(该分组语句的统计值)与统计样本 中总的所有语句统计值的占比。- total:表示Attribute列描述的Count、Exec time、Lock time等属性的统计值。
- min:表示Attribute列描述的Exec time、Lock time等属性的最小值。
- max:表示Attribute列描述的Exec time、Lock time等属性的最大值。
- avg:表示Attribute列描述的Exec time、Lock time等属性的平均值。
- 95%:表示语句对应的Exec time、Lock time等属性值从大到小排序之后,位于 95%位置的那个数值(需要重点关注这个值)。
- stddev:标准偏差,用于数值的分布统计。
- median:代表对应属性值的中位数,将所有值从小到大排列,取位于中间的那个 数值。
- Databases:库名。
- Users:各个用户执行的次数(占比)。
- Query_time distribution:查询时间分布,由“#”字符表示的长短体现了语句执行时 间的占比区间。从上述代码段中可以看到,执行时间在1s左右的查询数量占绝大多数。
- Tables:使用查询语句中涉及的表生成的用于查询表统计信息和表结构的SQL语 句文本。
- EXPLAIN:表示查询语句的样本(方便复制出来查看执行计划。注意,该语句不 是随机生成的,而是分组语句中最差的查询SQL语句)
使用示例
最近12小时的查询
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --since=12h > slow_report_12h.log
指定时间范围内的查询
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --since '2020-08-26 11:30:00' --until '2020-08-26 12:00:00'> slow_report_range.log
分析只是select的慢查询
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --filter '$event->{fingerprint} =~ m/^select/i' > slow_report_select.log
针对某个用户的慢查询
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --filter '($event->{user} || "") =~ m/^root/i' > slow_report_db.log
查询所有的全表扫描或FULL JOIN的慢查询
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --filter '(($event->{Full_scan} || "") eq "yes") || (($event->{Full_join} || "") eq "yes")' > slow_report_full.log
将查询分析结果保存到query_review表中
会在指定的test库下生成 query_review 表
pt-query-digest --user=root --password=1122333 --review h=localhost,D=yqtest,t=query_review --create-review-table --no-report /var/lib/mysql/VM_0_9_centos-slow.log
将查询分析结果保存到query_history表中
pt-query-digest --user=root --password=1122333 --history h=localhost,D=yqtest,t=query_history --create-history-table --no-report /var/lib/mysql/VM_0_9_centos-slow.log