一、简介
pt-query-digest是用于分析mysql慢查询日志的工具,它还可以分析来自“show processlist”和mysql的查询 tcpdump中的协议数据。我们可以把分析日志输出到指定的文件中,通过分析日志文件做对应的优化等操作。
二、下载并且安装
- 根据不同的系统安装,我的系统是centos,所以直接选择centos安装,点击下载
- 直接使用yum安装
> wget http://www.51sjk.com/upload/articles/1/0/338/338003_20221201144146178.rpm > yum install percona-toolkit-3.4.0-3.el7.x86_64.rpm
- 或者使用源码包编译安装
> wget http://www.51sjk.com/upload/articles/1/0/338/338003_20221201144202491.gz > tar -zxvf percona-toolkit-3.4.0.tar.gz > cd percona-toolkit-3.4.0 > perl makefile.pl prefix=/usr/local/percona-toolkit > make && make install
三、安装完成
php入门到就业线上直播课:进入学习
四、分析msql的慢查询日志
- pt-query-digest参数可以使用perldoc命令查看
perldoc /usr/bin/pt-query-digest
- 分析整个慢日志文件
pt-query-digest mysql-slow.log > slow_report.log
- 分析指定时间的日志since~until
pt-query-digest mysql-slow.log --since '2022-10-01 00:00:00' --until '2022-11-05 00:00:00' > slow_report_date_20221021-202221105.log
- –since: 表示开始时间
- –until: 表示结束时间
- 分析慢日志,并且保存分析结果到mysql数据表
pt-query-digest --user=root --password=123456 --history h=192.168.33.10,d=local_test_db,t=query_review --create-history-table mysql-slow.log --since '2022-11-01 00:00:00' --until '2022-11-05 00:00:00'
- –user: 数据库用户名
- –password: 数据库密码
- h: 数据库 host
- d: 数据库名
- t: 生成的表名
五、结果分析
第一部分: 总的一个分析概况
overall:总共有多少条查询
time range:查询执行的时间范围
unique:唯一查询数量,即对查询条件进行参数化以后,总共有多少个不同的查询
total:所有查询总计时长
min:所有查询最小时长
max:所有查询最大时长
avg:所有查询平均时长
95%:把所有时长值从小到大排列,位置位于 95% 的那个时长数,这个数一般最具有参考价值
median:中位数,把所有时长值从小到大排列,位置位于中间那个时长数
# a software update is available: # 23.7s user time, 15.8s system time, 35.67m rss, 249.01m vsz 说明: 执行过程中,在用户中所花费的所有时间 执行过程中,在内核空间中所花费的所有时间 pt-query-digest 进程所分配的内存大小 pt-query-digest 进程所分配的虚拟内存大小 # current date: mon nov 7 09:01:23 2022 说明:当前时间 # hostname: localhost.localdomain 说明:执行pt-query-digest的主机名 # files: mysql-slow.log 说明:被分析的文件名称 # overall: 44.78k total, 54 unique, 0.01 qps, 0.07x concurrency __________ 说明: total: 语句总数量 unique: 唯一语句数量 qps: 每秒查询量 concurrency: 查询的并发 # time range: 2022-10-01 00:00:03 to 2022-11-04 16:05:24 说明:执行过程中日志记录的时间范围 # attribute total min max avg 95% stddev median 说明:属性 总计 最小值 最大值 平均值 95% 标准差 中位数 95%: 把所有时长值从小到大排列,位置位于 95% 的那个时长数,这个数一般最具有参考价值 median: 中位数,把所有时长值从小到大排列,位置位于中间那个时长数 # ============ ======= ======= ======= ======= ======= ======= ======= # exec time 204553s 3s 1540s 5s 10s 8s 3s 说明:执行时间 # lock time 8s 0 107ms 186us 80us 2ms 36us 说明:锁占用时间 # rows sent 238.87m 0 2.88m 5.46k 11.95 68.22k 0.99 说明:发送到客户端的行数 # rows examine 73.56g 0 5.01m 1.68m 3.86m 724.49k 1.32m 说明:扫描的语句行数 # query size 8.18m 30 4.36k 191.46 511.45 224.63 72.65 说明:查询的字符数
第二部分:分析
rank:所有语句的排名,默认按查询时间降序排列,通过 –order-by 指定
- –order-by query_time:sum :按总的查询时间倒序
排序参数介绍:
sum sum/total attribute value(默认值)
min minimum attribute value(最小值)
max maximum attribute value(最小值)
cnt frequency/count of the query(按出现sql次数)
- –order-by query_time:sum :按总的查询时间倒序
query id:语句的 id(去掉多余空格和文本字符,计算 hash 值)
response:总的响应时间
time:该查询在本次分析中总的时间占比
calls:执行次数,即本次分析总共有多少条这种类型的查询语句
r/call:平均每次执行的响应时间
v/m:响应时间 variance-to-mean 的比率
item:查询对象
# profile 说明:分析 # rank query id response time calls r/call # ==== =================================== ================ ===== ======= # 1 0xc000aa97f210b2aeae4933af9b00296a 104236.2061 5... 30988 3.3638 0.03 select xxx # 2 0x974c6e6d54db8b0df505ca7bdc508686 32167.9607 15.7% 3418 9.4113 1.34 select xxx # 3 0x6be180c5804b585f25bb16550447dc6c 18453.0185 9.0% 2499 7.3842 0.92 select xxx # 4 0xadf16e3e9eb5d6b08245e39ff1428c9f 17873.4338 8.7% 3114 5.7397 0.84 select xxx # 5 0x2964cd629a24595719659bdaebcf0e6f 10648.5404 5.2% 1437 7.4103 0.93 select xxx # 6 0x50566e6dcf8fa562b88ae41ab1e32dc6 7424.3855 3.6% 303 24.5029 15.41 select xxx # 7 0xdb0a3d60f85c2212c476b144e1678ab8 5327.8370 2.6% 1627 3.2746 0.05 select xxx # 8 0x04bb0b332ceed517298ab06de2a30ad6 3190.6822 1.6% 657 4.8564 1.36 select xxx # 10 0xdab0af524151c621dc0e9b92ac002c38 526.6288 0.3% 140 3.7616 0.01 select xxx # misc 0xmisc 1807.1067 0.9% 57 31.7036 0.0 <27 items>
第三部分:具体的sql统计和分析
pct:该 sql 语句某执行属性占所有慢查询语句某执行属性的百分比
total:该 sql 语句某执行属性的所有属性时间。
count:sql 语句执行的次数。对应的 pct 表示此 sql 语句执行次数占所有慢查询语句执行次数的 % 比(下图为 69%),对应的 total 表示总共执行了 30988 次。
exec time:sql 执行时间
lock time:sql 执行期间被锁定的时间
rows sent:传输的有效数据,在 select 查询语句中才有值
rows examine:总共查询的数据,非目标数据。
query_time distribution:查询时间分布
sql 语句:下图中为 select sleep(7)\g
# query 1: 0.01 qps, 0.03x concurrency, id 0xc000aa97f210b2aeae4933af9b00296a at byte 221452362 说明:查询队列1:每秒查询量,查询的并发,队列1的id值,对应第二部分的query id, 221452362表示偏移量(查看方法看下面的“查看偏移”) # this item is included in the report because it matches --limit. # scores: v/m = 0.03 # time range: 2022-10-01 00:00:05 to 2022-11-04 16:05:24 说明:sql语句在慢日志文件mysql_slow.log出现的时间范围 # attribute pct total min max avg 95% stddev median 说明:属性 占整个 总数 最小值 最大值 平均值 95% 标准差 中间值 分析中 的百分 比 # ============ === ======= ======= ======= ======= ======= ======= ======= # count 69 30988 说明:执行语句总数量 # exec time 50 104236s 3s 7s 3s 4s 303ms 3s 说明:执行时间 # lock time 24 2s 22us 93ms 65us 66us 775us 38us 说明:锁占用时间 # rows sent 0 70.53k 0 799 2.33 3.89 16.60 0.99 说明:发送到客户端的行数 # rows examine 54 40.28g 1.32m 1.35m 1.33m 1.32m 15.65k 1.32m 说明:扫描语句的行数 # query size 26 2.16m 73 73 73 73 0 73 说明:查询的字符数 # string: # hosts localhost 说明:使用的数据主机ip # users xxx 说明:使用的用户 # query_time distribution # 1us # 10us # 100us # 1ms # 10ms # 100ms # 1s ################################################################ # 10s 说明:查询时间分布 # tables # show table status like 'xxx'\g # show create table `xxx`\g # explain /*!50100 partitions*/ select * from `table_name` where `updated_at` >= '2022-10-15 00:00:40'\g 说明:查询的mysql语句 第三部分是每一种查询比较慢的 sql 的详细统计结果 pct:该 sql 语句某执行属性占所有慢查询语句某执行属性的百分比 total:该 sql 语句某执行属性的所有属性时间。 count:sql 语句执行的次数。 exec time:sql 执行时间 lock time:sql 执行期间被
六 查看偏移
- 可以利用偏移量在慢查询日志文件中到查找到具体的 sql 语句,查找方法如下:
[localhost]# tail -c 221452362 ./mysql-slow.log | head t: root[root] @ localhost [] id: 13704150 # query_time: 7.058835 lock_time: 0.000040 rows_sent: 2 rows_examined: 1392521 set timestamp=1665763267; select * from `xxxxxx` where `updated_at` >= '2022-10-15 00:00:40'; # user@host: root[localhost] @ localhost [] id: 13704174 # query_time: 7.445741 lock_time: 0.000015 rows_sent: 3 rows_examined: 2214002 set timestamp=1665763267; select xxx from table where xxx # time: 221015 008 # user@host: root[localhost] @ localhost [] id: 13704414
以上就是实例分析mysql中pt-query-digest工具的使用记录的详细内容,更多请关注其它相关文章!