简介
pt-query-digest是一个用于分析 MySQL 慢查询日志的工具。它可以对慢查询日志进行详细的分析,总结出查询的执行情况,包括各种统计信息,如不同查询类型的出现次数、执行时间分布等,帮助数据库管理员更好地了解数据库的负载情况和查询性能,以便进行针对性的优化和改进。
官方文档:https://docs.percona.com/percona-toolkit/pt-query-digest.html
1.安装percona-toolkit:
#!/bin/bash
#官网下载地址,版本可选:https://www.percona.com/downloads
wget https://downloads.percona.com/downloads/percona-toolkit/3.2.0/binary/tarball/percona-toolkit-3.2.0_x86_64.tar.gz
tar zxf percona-toolkit-3.2.0_x86_64.tar.gz -C /usr/bin
echo 'export PATH=/usr/bin/percona-toolkit-3.2.0/bin:$PATH' >>/etc/profile
source /etc/profile
2.验证一下是否安装完成 pt-query-digest
[root@ECS ~]#which pt-query-digest
/usr/bin/percona-toolkit-3.2.0/bin/pt-query-digest
3.工具安装完成后,进入天翼云控制台下载对应实例慢查询日志到本地服务器
4.慢查询日志上传到服务器后,使用pt-query-digest进行分析
# 直接分析慢查询文件:
pt-query-digest slow.log > file.txt
# 分析最近1小时内的查询:
pt-query-digest --since=1h slow.log > file.txt
# 分析指定时间范围内的查询:
pt-query-digest slow.log --since '2017-08-03 15:30:00' --until '2017-08-04 10:30:00' > file.txt
# 分析binlog:
mysqlbinlog --base64-output=decode-rows -vvv
mysqlbinlog --base64-output=decode-rows -vvv --start-datetime='起始时间' --stop-datetime='结束时间' 1.binlog >1.sql
pt-query-digest --type=binlog mysql-bin000001.sql >file.txt
# 分析general log:
pt-query-digest --type=genlog localhost.log > file.txt
5.查看分析结果,结果分为3个部分
Overall(总体统计):
提供了一些关于分析的整体信息,如查询的总数、不同类型查询的数量、总执行时间等宏观数据。
360ms user time, 10ms system time, 22.56M rss, 187.09M vsz:该工具执行日志分析的用户时间,系统时间,物理内存占用大小,虚拟内存占用大小
Current date :工具执行时间
Hostname :运行分析工具的主机名
Files :被分析的文件名
Overall :语句总数量
Time range:日志记录的时间范围
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
语句执行时间
# Exec time
锁占用时间
# Lock time
发送到客户端的行数
# Rows sent
select语句扫描行数
# Rows examine
查询的字符数
# Query size
Queries(具体查询):
详细列出了被分析到的各个具体查询语句,以及它们的执行频率、平均执行时间、占总执行时间的比例等具体指标,帮助了解哪些查询是主要的性能关注点。
# Profile
Rank:所有语句的排名,默认按查询时间降序排列,通过--order-by指定
Query ID:语句的ID,(去掉多余空格和文本字符,计算hash值)
Response:总的响应时间
time:该查询在本次分析中总的时间占比
calls:执行次数,即本次分析总共有多少条这种类型的查询语句
R/Call:平均每次执行的响应时间
V/M:响应时间Variance-to-mean的比率
Item:查询对象
# Rank Query ID Response time Calls R/Call V/M Item
# ==== =============================== =============== ===== ====== =====
# 1 0x15FA65D8DB4B11C0 1246.6948 41.7% 283 4.4053 0.04 UPDATE
# 2 0x116CC9D48CAFD899 877.6900 29.3% 339 2.5891 0.09 SELECT
# 3 0xD53FB261E6C9C12B 299.4193 10.0% 71 4.2172 0.05 SELECT
# 4 0xF3DECDC01AF3779A 127.0137 4.2% 46 2.7612 0.04 SELECT
# 5 0xB558D6F49F185C6F 118.3138 4.0% 49 2.4146 0.05 SELECT
# 6 0x133B98C8766974A3 97.0805 3.2% 35 2.7737 0.56 SELECT
# 7 0xFE5BDEA5171D2C01 52.5870 1.8% 22 2.3903 0.04 SELECT
# 8 0x492DA473109C81AE 43.7895 1.5% 16 2.7368 0.08 SELECT
# 9 0x01795767187F3AB1 41.3720 1.4% 15 2.7581 1.17 SELECT
# MISC 0xMISC 86.7871 2.9% 30 2.8929 0.0 <12 ITEMS>
Rank Query ID 对应详细的SQL及优化建议:
# Time range: 2024-05-17T15:51:48 to 2024-05-17T17:39:59
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 33 6929
# Exec time 35 23673s 1s 8s 3s 5s 1s 4s
# Lock time 44 23s 1ms 206ms 3ms 13ms 8ms 1ms
# Rows sent 17 12.71k 0 5 1.88 4.96 1.72 0.99
# Rows examine 0 37.98k 0 18 5.61 11.95 4.53 4.96
# Bytes sent 1 794.04k 87 168 117.35 166.51 28.55 107.34
# Query size 24 6.88M 1.02k 1.02k 1.02k 1012.63 0 1012.63
# Bytes receiv 0 0 0 0 0 0 0 0
# Created tmp 0 0 0 0 0 0 0 0
# Created tmp 43 196.23k 29 29 29 29 0 29
# Errno 0 0 0 0 0 0 0 0
# Read first 40 148.87k 22 22 22 22 0 22
# Read key 42 301.76M 44.57k 44.64k 44.60k 44.45k 0 44.45k
# Read last 0 0 0 0 0 0 0 0
# Read next 40 2.36G 357.13k 357.25k 357.19k 345.04k 0 345.04k
# Read prev 0 0 0 0 0 0 0 0
# Read rnd 0 0 0 0 0 0 0 0
# Read rnd nex 48 4.68G 706.53k 709.98k 707.64k 683.15k 0 683.15k
# Sort merge p 59 13.53k 2 2 2 2 0 2
# Sort range c 0 0 0 0 0 0 0 0
# Sort rows 36 2.52M 371 393 381.51 381.65 8.88 381.65
# Sort scan co 62 33.83k 5 5 5 5 0 5
# String:
# Databases bid
# End 2024-05-17... (1/0%), 2024-05-17... (1/0%)... 6927 more
# Hosts 192.168.200.120
# Start 2024-05-17... (1/0%), 2024-05-17... (1/0%)... 6927 more
# Users jstcc_bid
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s ################################################################
# 10s+
# Tables
# SHOW TABLE STATUS FROM `bid` LIKE 'v_pending_item'\G
# SHOW CREATE TABLE `bid`.`v_pending_item`\G
# SHOW TABLE STATUS FROM `bid` LIKE 'v_user_edit_project'\G
# SHOW CREATE TABLE `bid`.`v_user_edit_project`\G
# SHOW TABLE STATUS FROM `bid` LIKE 't_user_permission_depart'\G
# SHOW CREATE TABLE `bid`.`t_user_permission_depart`\G
# SHOW TABLE STATUS FROM `bid` LIKE 'v_user_edit_permission'\G
# SHOW CREATE TABLE `bid`.`v_user_edit_permission`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT
type,
IFNULL( COUNT( ttt.type ), 0 ) countNum
FROM(
select * from
(
SELECT
DISTINCT
t.*
FROM
table1 t
LEFT JOIN (
SELECT DISTINCT
v.project_id
FROM
table2 v
where 1 = 1
order by tt.orderNum asc , tt.time desc
) ttt
GROUP BY ttt.type\G
到这里pt-query-digest工具就介绍完了。分析慢查询只是问题的开始,如何优化慢查询才是重点,下一篇将详细说明慢SQL该如何进行优化。