前言
我们通常使用 mysqldumpslow 工具来分析 MySQL 慢日志,这里推荐一个更加完善,输出有用信息更多的工具 pt-query-digest。
基本用法
1. 直接分析慢日志
pt-query-digest rds_slow_query.log > rds_slowlog_digest.log
```
`
#### 2. 只分析针对某个用户的慢查询
````undefined
pt-query-digest --filter '($event->{user} || "") =~ m/^rudonx/i' rds_slow_query.log> rds_slowlog_digest1.log
```
`
#### 3. 只分析最近1天的慢查询
````undefined
pt-query-digest --since=24h rds_slow_query.log > rds_slowlog_digest2.log
```
`
#### 4. 查询所有全表扫描或者是 full join 慢查询
````undefined
pt-query-digest --filter '(($event->{Full_scan} || "") eq "yes") ||(($event->{Full_join} || "") eq "yes")' rds_slow_query.log> rds_slowlog_digest3.log
```
`
#### 5. 查询所有 select 类型的慢 SQL
````undefined
pt-query-digest --filter '$event->{arg} =~ m/^select/i' rds_slow_query.log> rds_slowlog_digest4.log
```
`
#### 6. 查询 query 大于 1M 的慢查询
````undefined
pt-query-digest --filter '$event->{bytes} >= 1' rds_slow_query.log> rds_slowlog_digest5.log
```
`
#### 7. 查询执行的 IP 地址发起的慢查询
````undefined
pt-query-digest --filter '($event->{host} || $event->{ip} || "") =~ m/127.0.0.1/' rds_slow_query.log> rds_slowlog_digest6.log
```
`
#### 8. 查询指定时间范围内的查询
````undefined
pt-query-digest rds_slow_query.log --since '2022-03-22 17:30:00' --until '2022-03-22 18:00:00'> > slow_report7.log
```
`
# 输出内容解析
输出文件中的内容可以分为三个部分,解析如下:
### 第一部分
第一部分指名了输出结果的总体信息。
表明pt-query-digest 在运行过程中在用户态,内核态,以及分配的内存和虚拟内存的大小:
````undefined
# 160ms user time, 10ms system time, 29.75M rss, 224.98M vsz
```
`
指明当前日期,运行 pt-query-digest 的主机名,以及文件名:
````undefined
# Current date: Tue Mar 22 08:07:11 2022
# Hostname: ip-10-0-0-22.cn-northwest-1.compute.internal
# Files: rds_slow_query.log
```
`
表明语句的总数量,对查询条件进行参数化以后,总共有多少个不同的查询,每秒查询以及查询的并发
````undefined
# Overall: 20 total, 7 unique, 0.00 QPS, 0.01x concurrency _______________
```
`
日志记录的时间范围:
````undefined
# Time range: 2022-03-03T18:02:35 to 2022-03-15T18:08:17
```
`
这部分指明了语句在执行过程中的统计信息,分别为:
* total:总计
* min:最小
* max:最大
* avg:平均
* 95%:将所有值从小到大排列,位置位于95%的那个数
* stddev:标准差
* median:中位数,把所有值从小到大排列,位置位于中间那个数
同时还有执行时间(exec time) 以及 锁时间(lock time),发送到客户端的行数(Rows sent),扫描的行数(rows examine),以及查询的字符数(query size)
````undefined
**# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 6268s 1s 2887s 313s 1909s 733s 2s
# Lock time 3ms 0 660us 142us 541us 160us 80us
# Rows sent 12 0 1 0.60 0.99 0.49 0.99
# Rows examine 109.07M 0 9.54M 5.45M 9.30M 4.23M 8.86M
# Query size 1.26k 25 730 64.55 54.21 150.76 26.08**
```
`
### 第二部分
第二部分输出了分组统计信息。
* Rank:所有语句的排名,默认按查询时间降序排列。
* Query ID:语句的ID信息,是通过hash得到的。
* Response:总的响应时间
* time:该查询在本次分析中总的时间占比
* calls:执行次数,也就是说,本次分析总共有多少条这种类型的查询语句。
* R/Call:平均每次执行的响应时间。
* V/M:响应时间Variance-to-mean的比率
* Item:查询对象
````undefined
# Profile
# Rank Query ID Response time Calls R/Call V/M
# ==== ============================= =============== ===== ========= =====
# 1 0x6A4427C529BE8F5939FB73A8... 6242.4422 99.6% 5 1248.4884 82... CALL add_t_user
# 2 0x62335394101D6CACEC5B16DB... 15.6641 0.2% 10 1.5664 0.01 SELECT t_user
# MISC 0xMISC 10.3380 0.2% 5 2.0676 0.0 <5 ITEMS>
```
`
### 第三部分
第三部分指明了每一种查询的详细统计信息,是对第二部分输出内容的扩展,其中包括:
* ID:查询的ID号,和第二部分的 Query ID对应
* Databases:涉及到的数据库名
* Hosts:运行语句客户端分布情况
* Users:各个用户执行的次数占比
* Query_time distribution :查询时间分布
* Tables:查询中涉及到的表
* Explain:涉及到的 SQL 语句
````undefined
# Query 1: 0.00 QPS, 0.01x concurrency, ID 0x6A4427C529BE8F5939FB73A8E21D6C8C at byte 7960
# This item is included in the report because it matches --limit.
# Scores: V/M = 825.53
# Time range: 2022-03-03T18:10:41 to 2022-03-11T16:32:31
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 25 5
# Exec time 99 6242s 196s 2887s 1248s 2821s 1015s 964s
# Lock time 60 2ms 148us 660us 344us 657us 216us 194us
# Rows sent 0 0 0 0 0 0 0 0
# Rows examine 0 0 0 0 0 0 0 0
# Query size 64 832 25 730 166.40 719.66 277.93 24.84
# String:
# Databases insert_test
# Hosts 180.184.74.156 (3/60%), 192.168.1.57 (2/40%)
# Users rudonx
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s
# 10s+ ################################################################
call add_t_user(10000000)\G
```
`
# 总结
从上面可以看出,pt-query-digest 具有多种使用姿势,输出内容也比 mysqldumpslow 更加丰富,是一款分析慢日志的利器。
# 参考文档
[1][https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html](https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html)
**如果您有其他问题,欢迎您联系火山引擎**[技术支持服务](https://console.volcengine.com/ticket/createTicketV2/)