在 MySQL 數據庫的日常運維中,慢查詢往往是導致性能瓶頸的關鍵因素。如何快速定位那些「不合適」的 SQL 語句,並在其演變為嚴重故障前進行優化?Percona Toolkit 中的 pt-query-digest 是一款威力強大的分析利器,它能對慢查詢日誌、Binlog、General Log 甚至網絡抓包數據進行深度解析,幫助 DBA 精準鎖定性能殺手。本文將系統介紹該工具的安裝、多場景使用姿勢、報告解讀以及核心參數詳解。
pt-query-digest 的核心價值在於「參數化分組統計」。它將具體參數值抽象化(如 WHERE id=1 和 WHERE id=2 歸為同一類),按查詢模式聚合統計執行時間、次數、佔比等指標。除此之外,它還支援 --review 功能,可將分析結果寫入資料表,結合 EXPLAIN 執行計劃,實現查詢審計與歷史趨勢追蹤。
支援的數據源:
SHOW PROCESSLIST 實時採樣作為 Perl 腳本,無需編譯安裝:
wget percona.com/get/pt-query-digest
chmod u+x pt-query-digest
pt-query-digest slow.log > slow_report.log
# 最近 12 小時
pt-query-digest --since=12h slow.log > slow_report2.log
# 指定具體時間範圍
pt-query-digest slow.log --since '2024-01-15 09:30:00' --until '2024-01-15 10:00:00' > slow_report3.log
# 僅分析 SELECT 語句
pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' slow.log > report_select.log
# 僅分析 root 用戶
pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' slow.log > report_root.log
# 全表掃描或 Full Join
pt-query-digest --filter '(($event->{Full_scan} || "") eq "yes") || (($event->{Full_join} || "") eq "yes")' slow.log > report_fullscan.log
--review:按指紋去重,一類查詢一條記錄,適合建立查詢審計基線表。
--history:保留時間維度,同一 CHECKSUM 不同時區間會產生多條記錄,適合對比歷史性能變化。
# 建立審計表並導入
pt-query-digest --user=root --password=xxx --review h=localhost,D=test,t=query_review --create-review-table slow.log
# 歷史表導入(按日期分文件)
pt-query-digest --user=root --password=xxx --history h=localhost,D=test,t=query_history --create-history-table slow.log_20240115
# 抓取 3306 端口流量
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
pt-query-digest --type tcpdump mysql.tcp.txt > report_tcpdump.log
# Binlog 分析
mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql
pt-query-digest --type=binlog mysql-bin000093.sql > report_binlog.log
包含執行次數分佈、查詢時間分佈圖、涉及表結構、EXPLAIN 輸出、使用者分佈等。重點關注:
| 參數 | 說明 |
|---|---|
--create-review-table | 配合 --review 自動建表 |
--filter | Perl 代碼片段過濾事件,極其靈活 |
--limit | 輸出 Top N 或 Top X%(默認 20) |
--since / --until | 時間範圍切片,支援 12h、yyyy-mm-dd hh:mm:ss |
--output | 報告格式:report(默認)、slowlog、json 等 |
--type | 輸入類型:slowlog、binlog、genlog、tcpdump |
若尚未開啟慢查詢,請在 /etc/my.cnf 中添加:
[mysqld]
log-output=FILE
slow_query_log=1
slow_query_log_file=/data/dbdata/slow_query.log
long_query_time=1
log_queries_not_using_indexes=1
修改後重啟 MySQL 服務生效。
pt-query-digest 不僅是分析工具,更是構建「查詢審計體系」的基石。建議將其納入日常巡檢流程,結合 --review 表持久化歷史指紋,定期對比 --history 表發現性能退化趨勢,做到「早發現、早優化、早受益」。