pt-query-digest工具可以通過慢查詢?nèi)罩句套堋⑵胀ú樵內(nèi)罩尽inlog對MySQL中的查 詢語句進行分析凫乖,也可以通過SHOW PROCESSLIST語句輸出信息峻仇,以及tcpdump 抓取的 MySQL協(xié)議數(shù)據(jù)對MySQL中的查詢語句進行分析俄讹。
官方文檔: https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html
ps:個人來說還是傾向于將慢日志記錄到 slow_log表中去的
解析慢查詢?nèi)罩?/h1>
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log > slow_report.log
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log > slow_report.log
輸出結(jié)果分為3部分
第一部分
匯總信息
[root@VM_0_9_centos ~]# more slow_report.log
# 230ms user time, 20ms system time, 26.35M rss, 220.76M vsz # CPU和內(nèi)存使用信息
# Current date: Wed Aug 26 15:44:46 2020 # 當前時間
# Hostname: VM_0_9_centos # 主機名
# Files: /var/lib/mysql/VM_0_9_centos-slow.log # 輸入的慢日志路徑
## 整個分析結(jié)果的匯總信息
# Overall: 258 total, 37 unique, 0.02 QPS, 0.00x concurrency _____________
# Time range: 2020-08-26T11:20:16 to 2020-08-26T15:44:11
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 7s 249us 5s 26ms 4ms 311ms 657us
# Lock time 349ms 0 152ms 1ms 348us 12ms 194us
# Rows sent 33.01k 0 9.77k 131.03 755.64 742.92 0.99
# Rows examine 93.32k 0 9.77k 370.38 874.75 775.00 54.21
# Query size 51.71k 15 7.23k 205.23 223.14 615.30 143.84
- Overall:總共有多少個查詢哆致,該例總共有2.58k(2580)個查詢。
- Time range:查詢執(zhí)行的時間范圍患膛。注意摊阀,MySQL5.7版本中的時間格式不同于之 前的版本。
- Unique:唯一查詢數(shù)量踪蹬,即對查詢條件進行參數(shù)化以后胞此,總共有多少個不同的查 詢。該例為10個跃捣。
- Attribute:如上述代碼段所示漱牵,表示Attribute列描述的Exec time、Lock time等屬性 名稱疚漆。
* total:表示Attribute列描述的Exec time酣胀、Lock time等屬性的統(tǒng)計數(shù)值。
* min:表示Attribute列描述的Exec time娶聘、Lock time等屬性的最小值闻镶。
* max:表示Attribute列描述的Exec time、Lock time等屬性的最大值丸升。
* avg:表示Attribute列描述的Exec time铆农、Lock time等屬性的平均值。
* 95%:表示Attribute列描述的Exec time狡耻、Lock time等屬性的所有值從小到大排 列墩剖,然后取位于95%位置的那個數(shù)值(需要重點關(guān)注這個值)。
* stddev:標準偏差夷狰,用于數(shù)值的分布統(tǒng)計岭皂。
* median:表示Attribute列描述的Exec time、Lock time等屬性的中位數(shù)孵淘,即把所有 值從小到大排列蒲障,取位于中間的那個數(shù)值
第二部分
對查詢進行參數(shù)化并分組,然后對各類查詢的執(zhí)行情況進行分析,結(jié)果按總執(zhí)行時間從大到小排列
# Profile
# Rank Query ID Response time Calls R/Call V/M It
# ==== =============================== ============= ===== ====== ===== ==
# 1 0x59A74D08D407B5EDF9A57DD5A4... 5.0003 73.7% 1 5.0003 0.00 SELECT
# 2 0x64EF0EA126730002088884A136... 0.9650 14.2% 2 0.4825 0.01
# 3 0x5E1B3DE19F673369DCF52FE6A5... 0.3174 4.7% 2 0.1587 0.00 INSERT data_million_a
# 4 0x3992A499999D8F9E3ACC220E0F... 0.1334 2.0% 1 0.1334 0.00 ALTER TABLE dtb_table_size `dtb_table_size`
# 5 0x66CAA645BA3ED5433EADC39CCA... 0.0991 1.5% 2 0.0495 0.08 SELECT data_million_a
# MISC 0xMISC 0.2735 4.0% 250 0.0011 0.0 <32 ITEMS>
- Rank:為查詢生成的數(shù)字編號揉阎,表示該分類語句在整個分析結(jié)果集中的排名庄撮。
- Query ID:為查詢生成的隨機字符串ID(根據(jù)指紋語句生成的checksum隨機字符串)。
- Response time:該查詢的總的響應(yīng)時間和占所有查詢的總的響應(yīng)時間的百分比毙籽。
- Calls:該查詢的執(zhí)行次數(shù)洞斯,即本次分析總共有多少條這種類型的查詢語句。
- R/Call:該查詢平均每次執(zhí)行的響應(yīng)時間坑赡。
- V/M:響應(yīng)時間的方差與均值的比值烙如。
- Item:具體的查詢語句對象(標準化格式轉(zhuǎn)換的語句形式:去掉了具體的select字段和表名、where條件等)
第三部分
按照語句執(zhí)行的總時間毅否,從大到小依次打印每條語句的相關(guān)統(tǒng)計信息
# Query 1: 0 QPS, 0x concurrency, ID 0x59A74D08D407B5EDF9A57DD5A41825CA at byte 0
# Scores: V/M = 0.00
# Time range: all events occurred at 2020-08-26T11:20:16
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 0 1
# Exec time 73 5s 5s 5s 5s 5s 0 5s
# Lock time 0 0 0 0 0 0 0 0
# Rows sent 0 1 1 1 1 1 0 1
# Rows examine 0 0 0 0 0 0 0 0
# Query size 0 15 15 15 15 15 0 15
# String:
# Hosts localhost
# Users root
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s ################################################################
# 10s+
# EXPLAIN /*!50100 PARTITIONS*/
select sleep(5)\G
- Time range:查詢執(zhí)行的時間范圍亚铁。注意,MySQL5.7版本中的時間格式不同于之 前的版本螟加。
- Attribute:如上述代碼段所示徘溢,表示Attribute列描述的Count、Exec time捆探、Lock time等屬性名稱然爆。
- pct:表示該分組語句(這里指上述代碼段中“Query 1”代表的分組語句,具體的語 句樣本在EXPLAIN ...關(guān)鍵字下面有輸出黍图。另外曾雕,在上述代碼段中,如total助被、min等計算值
都是針對該語句分組的剖张,下文中不再贅述)的total值(該分組語句的統(tǒng)計值)與統(tǒng)計樣本 中總的所有語句統(tǒng)計值的占比。- total:表示Attribute列描述的Count恰起、Exec time修械、Lock time等屬性的統(tǒng)計值。
- min:表示Attribute列描述的Exec time检盼、Lock time等屬性的最小值肯污。
- max:表示Attribute列描述的Exec time、Lock time等屬性的最大值吨枉。
- avg:表示Attribute列描述的Exec time蹦渣、Lock time等屬性的平均值。
- 95%:表示語句對應(yīng)的Exec time貌亭、Lock time等屬性值從大到小排序之后柬唯,位于 95%位置的那個數(shù)值(需要重點關(guān)注這個值)。
- stddev:標準偏差圃庭,用于數(shù)值的分布統(tǒng)計锄奢。
- median:代表對應(yīng)屬性值的中位數(shù)失晴,將所有值從小到大排列,取位于中間的那個 數(shù)值拘央。
- Databases:庫名涂屁。
- Users:各個用戶執(zhí)行的次數(shù)(占比)。
- Query_time distribution:查詢時間分布灰伟,由“#”字符表示的長短體現(xiàn)了語句執(zhí)行時 間的占比區(qū)間拆又。從上述代碼段中可以看到,執(zhí)行時間在1s左右的查詢數(shù)量占絕大多數(shù)栏账。
- Tables:使用查詢語句中涉及的表生成的用于查詢表統(tǒng)計信息和表結(jié)構(gòu)的SQL語 句文本帖族。
- EXPLAIN:表示查詢語句的樣本(方便復(fù)制出來查看執(zhí)行計劃。注意挡爵,該語句不 是隨機生成的竖般,而是分組語句中最差的查詢SQL語句)
使用示例
最近12小時的查詢
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --since=12h > slow_report_12h.log
指定時間范圍內(nèi)的查詢
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --since '2020-08-26 11:30:00' --until '2020-08-26 12:00:00'> slow_report_range.log
分析只是select的慢查詢
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --filter '$event->{fingerprint} =~ m/^select/i' > slow_report_select.log
針對某個用戶的慢查詢
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --filter '($event->{user} || "") =~ m/^root/i' > slow_report_db.log
查詢所有的全表掃描或FULL JOIN的慢查詢
pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --filter '(($event->{Full_scan} || "") eq "yes") || (($event->{Full_join} || "") eq "yes")' > slow_report_full.log
將查詢分析結(jié)果保存到query_review表中
會在指定的test庫下生成 query_review 表
pt-query-digest --user=root --password=1122333 --review h=localhost,D=yqtest,t=query_review --create-review-table --no-report /var/lib/mysql/VM_0_9_centos-slow.log
將查詢分析結(jié)果保存到query_history表中
pt-query-digest --user=root --password=1122333 --history h=localhost,D=yqtest,t=query_history --create-history-table --no-report /var/lib/mysql/VM_0_9_centos-slow.log