如何利用pt-query-digest分析慢查询日志top SQL

  ORACLE数据库可利用awr报告来查找top sql,其实mysql中,我们可以利用pt-query-digest工具来查找时间最长的TOP SQL。
  pt-query-digest可以从普通MySQL日志,慢查询日志以及二进制日志中分析查询,甚至可以从SHOW PROCESSLIST和MySQL协议的tcpdump中进行分析,如果没有指定文件,它从标准输入流(STDIN)中读取数据。
[apps@mvxl0782 bin]$ pwd
/apps/tool/percona-toolkit-2.2.10/bin
[apps@mvxl0782 bin]$ ./pt-query-digest /apps/logs/mysql/slow3306.log

整个输出分为三大部分:

1、整体概要(Overall)

# 8.9s user time, 50ms system time, 25.92M rss, 200.46M vsz
# Current date: Mon Jul 25 21:50:47 2016
# Hostname: mvxl0782
# Files: /apps/logs/mysql/slow3306.log
# Overall: 23.07k total, 11 unique, 0.30 QPS, 0.73x concurrency __________
# Time range: 2016-07-25 00:00:07 to 21:35:16
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
# Exec time         56524s      1s    427s      2s     13s      5s      1s
# Lock time             2s    13us   791us   106us   176us    47us   103us
# Rows sent        213.29M       0  67.42M   9.47k    0.99 577.32k       0
# Rows examine      17.23G   2.79k  67.42M 783.39k  11.87M   2.66M  23.58k
# Merge passes           0       0       0       0       0       0       0
# Query size        12.67M      55   2.21k  576.00   1.78k  317.16  487.09
# Boolean:
# Full join     94% yes,   5% no
# Full scan     99% yes,   0% no
# Tmp table     99% yes,   0% no

这个部分是一个大致的概要信息(类似loadrunner给出的概要信息),通过它可以对当前MySQL的查询性能做一个初步的评估,比如各个指标的最大值(max),平均值(min),95%分布值,中位数(median),标准偏差(stddev)。这些指标有查询的执行时间(Exec time),锁占用的时间(Lock time),MySQL执行器需要检查的行数(Rows examine),最后返回给客户端的行数(Rows sent),查询的大小。

2、查询的汇总信息(Profile)

# Profile
# Rank Query ID           Response time    Calls R/Call  V/M   Item
# ==== ================== ================ ===== ======= ===== ===========
#    1 0x6B78B35582099676 24511.3273 43.4% 16194  1.5136  0.01 SELECT t_wo_message_log

t_work_order t_wo_message_log t_work_order
#    2 0xBAD5151487742A30 15576.7264 27.6%   910 17.1173 0.08 SELECT UNION t_order

t_tracking_log t_carrier_mapping t_order t_order_carrier t_tracking_log t_carrier_mapping
#    3 0x876A6CCFDEC46DBF  7594.0775 13.4%  5119  1.4835  0.00 SELECT t_wo_message_log

t_work_order t_wo_message_log t_work_order
#    4 0x28CFDDB4F8E96817  4457.6805  7.9%   260 17.1449  0.05 SELECT UNION t_order

t_tracking_log t_carrier_mapping t_order t_order_carrier t_tracking_log t_carrier_mapping
#    5 0x98AC2C95196539D6  2395.4859  4.2%   260  9.2134  0.01 SELECT t_order t_carrier_mapping

t_logistics_tranlog t_order_tracking
#    6 0x67A347A2812914DF  1528.9402  2.7%    17 89.9377 11... SELECT lots.t_order_tracking
#    7 0x86526DA43DDE0291   359.9037  0.6%   258  1.3950  0.01 SELECT t_order t_carrier_mapping

t_carrier_tracking t_logistics_tranlog
#    8 0xC73FF1C974FD7463    57.4173  0.1%    43  1.3353  0.00 UPDATE t_order t_order_cancel_log
# MISC 0xMISC                42.5195  0.1%     8  5.3149   0.0 <3 ITEMS>
每个查询都有一个Query ID,这个ID通过Hash计算出来的。pt-query-digest是根据这个所谓的Fingerprint来group by的。上面标红色部分是单次执行时间最长的TOP SQL,需要重点关注优化。

Rank整个分析中该“语句”的排名,一般也就是性能最常的。
Response time  “语句”的响应时间以及整体占比情况。
Calls 该“语句”的执行次数。
R/Call 每次执行的平均响应时间。
V/M 响应时间的差异平均对比率。
在尾部有一行输出,显示了其他2个占比较低而不值得单独显示的查询的统计数据。

3、详细信息

这个部分会列出Profile表中每个查询的详细信息:

# Query 1: 0.41 QPS, 0.62x concurrency, ID 0x6B78B35582099676 at byte 5708854
# Scores: V/M = 0.01
# Time range: 2016-07-25 08:17:47 to 19:16:35
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count         70   16194
# Exec time     43  24511s      1s      3s      2s      2s    94ms      1s
# Lock time     60      1s    37us   791us    90us   125us    29us    98us
# Rows sent      0   1.04k       0       3    0.07    0.99    0.28       0
# Rows examine  11   2.05G   8.41k 391.42k 132.46k 380.41k 163.63k  23.58k
# Merge passes   0       0       0       0       0       0       0       0
# Query size    60   7.64M     495     495     495     495       0     495
# Boolean:
# Full join    100% yes,   0% no
# Full scan    100% yes,   0% no
# Tmp table    100% yes,   0% no
# String:
# Databases    lots
# Hosts
# Users        lotsprd
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms
#    1s  ################################################################
#  10s+
# Tables
#    SHOW TABLE STATUS FROM `lots` LIKE 't_wo_message_log'\G
#    SHOW CREATE TABLE `lots`.`t_wo_message_log`\G
#    SHOW TABLE STATUS FROM `lots` LIKE 't_work_order'\G
#    SHOW CREATE TABLE `lots`.`t_work_order`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT  wo.id as woId,
                 w
.....................

包括Overall中有的信息、查询响应时间的分布情况以及该查询”入榜”的理由。
pt-query-digest还有很多复杂的操作,这里就不一一介绍了。比如:从PROCESSLIST中查询某个MySQL中最慢的

查询:
pt-query-digest –processlist h=host1

建议:当slow log很大的时候最好还是将日志文件移到其他机器上进行分析。

 

 

你可能感兴趣的:(mysql性能优化,mysql,DDL和PT工具)