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很大的时候最好还是将日志文件移到其他机器上进行分析。