使用 pt-query-digest
工具可以帮助分析 MySQL 查询的性能,找出慢查询、频繁查询以及消耗资源较多的查询,从而为优化提供依据。以下是详细深入的使用 pt-query-digest
进行查询分析的步骤和相关示例。
一、安装 pt-query-digest
pt-query-digest
是 Percona Toolkit 中的一个工具。可以通过以下方式安装:
1.1 使用包管理器安装
在 Debian/Ubuntu 系统上:
bash
sudo apt-get update
sudo apt-get install percona-toolkit
在 CentOS/RHEL 系统上:
bash
sudo yum install percona-toolkit
1.2 使用源代码安装
从 Percona Toolkit 官网下载并安装:
bash
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
):
ini
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1 # 设置记录慢查询的阈值,单位为秒
重启 MySQL 服务以应用配置:
bash
sudo systemctl restart mysql
2.2 启用通用查询日志(可选)
启用通用查询日志会记录所有查询,通常用于调试,不建议在生产环境长期启用:
ini
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mysql-general.log
重启 MySQL 服务以应用配置:
bash
sudo systemctl restart mysql
三、使用 pt-query-digest
分析查询日志
3.1 分析慢查询日志
使用 pt-query-digest
分析慢查询日志:
bash
pt-query-digest /var/log/mysql/mysql-slow.log > slow_query_report.txt
输出示例(部分):
plaintext
# 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
分析通用查询日志:
bash
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 示例
plaintext
# 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 示例
plaintext
# 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 创建索引示例
sql
CREATE INDEX idx_customer_id ON orders(customer_id);
5.2 优化查询语句示例
优化前:
sql
SELECT * FROM orders WHERE customer_id = ?;
优化后(假设创建了索引):
sql
SELECT * FROM orders USE INDEX (idx_customer_id) WHERE customer_id = ?;
5.3 使用EXPLAIN分析执行计划
sql
EXPLAIN SELECT * FROM orders WHERE customer_id = ?;
六、总结
通过使用 pt-query-digest
工具,可以深入分析 MySQL 查询的性能瓶颈,找出慢查询、频繁查询和资源消耗大的查询。通过分析报告,可以采取针对性的优化措施,包括创建索引、优化查询语句、调整配置参数等,从而显著提升 MySQL 数据库的性能和稳定性。