使用 pt-query-digest
工具可以幫助分析 MySQL 查詢的性能,找出慢查詢、頻繁查詢以及消耗資源較多的查詢,從而為優化提供依據。以下是詳細深入的使用 pt-query-digest
進行查詢分析的步驟和相關示例。
一、安裝 pt-query-digest
pt-query-digest
是 Percona Toolkit 中的一個工具。可以通過以下方式安裝:
1.1 使用包管理器安裝
在 Debian/Ubuntu 系統上:
sudo apt-get update
sudo apt-get install percona-toolkit
在 CentOS/RHEL 系統上:
sudo yum install percona-toolkit
1.2 使用源代碼安裝
從 Percona Toolkit 官網下載并安裝:
wget https://www.percona.com/downloads/percona-toolkit/3.0.13/source/tarball/percona-toolkit-3.0.13.tar.gz
tar -zxvf percona-toolkit-3.0.13.tar.gz
cd percona-toolkit-3.0.13
perl Makefile.PL
make
sudo make install
二、收集查詢日志
pt-query-digest
可以分析多種格式的日志文件,常見的是 MySQL 的慢查詢日志和通用查詢日志。
2.1 啟用慢查詢日志
編輯 MySQL 配置文件 (my.cnf
或 my.ini
):
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1 # 設置記錄慢查詢的閾值,單位為秒
重啟 MySQL 服務以應用配置:
sudo systemctl restart mysql
2.2 啟用通用查詢日志(可選)
啟用通用查詢日志會記錄所有查詢,通常用于調試,不建議在生產環境長期啟用:
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mysql-general.log
重啟 MySQL 服務以應用配置:
sudo systemctl restart mysql
三、使用 pt-query-digest
分析查詢日志
3.1 分析慢查詢日志
使用 pt-query-digest
分析慢查詢日志:
pt-query-digest /var/log/mysql/mysql-slow.log > slow_query_report.txt
輸出示例(部分):
# 220ms user time, 10ms system time, 26.56M rss, 115.73M vsz
# Current date: Tue May 18 10:12:34 2021
# Hostname: myserver
# Files: /var/log/mysql/mysql-slow.log
# Overall: 100 total, 20 unique, 0 QPS, 0x concurrency _______________
# Time range: 2021-05-17 10:00:00 to 2021-05-17 10:05:00
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Count 100
# Exec time 22s 50ms 1s 220ms 900ms 300ms 180ms
# Lock time 1s 0ms 20ms 10ms 15ms 5ms 8ms
# Rows sent 1000 1 100 10 50 20 5
# Rows examine 10000 10 500 100 400 150 75
3.2 分析通用查詢日志
使用 pt-query-digest
分析通用查詢日志:
pt-query-digest /var/log/mysql/mysql-general.log > general_query_report.txt
四、分析結果
pt-query-digest
輸出的報告通常分為幾個部分:
- Overall Summary:總結了日志文件中的總體情況,包括總查詢數、獨特查詢數、平均執行時間等。
- Top 10 Queries:列出了資源消耗最大的前10個查詢,按總執行時間排序。
- Detailed Query Information:詳細列出了每個查詢的執行情況,包括執行次數、總時間、平均時間、最大時間、鎖時間等。
4.1 Overall Summary 示例
# Overall: 100 total, 20 unique, 0 QPS, 0x concurrency _______________
# Time range: 2021-05-17 10:00:00 to 2021-05-17 10:05:00
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Count 100
# Exec time 22s 50ms 1s 220ms 900ms 300ms 180ms
# Lock time 1s 0ms 20ms 10ms 15ms 5ms 8ms
# Rows sent 1000 1 100 10 50 20 5
# Rows examine 10000 10 500 100 400 150 75
4.2 Top 10 Queries 示例
# Query 1: 0.25 QPS, 0.05x concurrency, ID 0x123456789ABCDEF
# Query_time: min=0.100s max=0.500s avg=0.300s 95%_interval=0.200s
# Lock_time: min=0.001s max=0.005s avg=0.003s 95%_interval=0.004s
# Rows_sent: min=10 max=100 avg=50 95%_interval=80
# Rows_examined: min=100 max=500 avg=300 95%_interval=400
SELECT * FROM orders WHERE customer_id = ?;
五、優化建議
根據 pt-query-digest
的分析結果,可以采取以下優化措施:
- 創建或優化索引:根據分析結果中顯示的頻繁查詢和慢查詢,創建或優化索引。
- 優化查詢語句:重寫具有高執行時間和高鎖等待時間的查詢,優化查詢邏輯。
- 調整配置參數:根據查詢的執行情況,調整MySQL的配置參數,如緩沖池大小、查詢緩存、連接數等。
- 分區和分表:對于大表,考慮使用分區或分表策略,以提高查詢效率。
- 使用EXPLAIN分析執行計劃:使用
EXPLAIN
命令進一步分析查詢的執行計劃,找出優化的具體措施。
5.1 創建索引示例
CREATE INDEX idx_customer_id ON orders(customer_id);
5.2 優化查詢語句示例
優化前:
SELECT * FROM orders WHERE customer_id = ?;
優化后(假設創建了索引):
SELECT * FROM orders USE INDEX (idx_customer_id) WHERE customer_id = ?;
5.3 使用EXPLAIN分析執行計劃
EXPLAIN SELECT * FROM orders WHERE customer_id = ?;
六、總結
通過使用 pt-query-digest
工具,可以深入分析 MySQL 查詢的性能瓶頸,找出慢查詢、頻繁查詢和資源消耗大的查詢。通過分析報告,可以采取針對性的優化措施,包括創建索引、優化查詢語句、調整配置參數等,從而顯著提升 MySQL 數據庫的性能和穩定性。