MySQL(187)如何使用pt-query-digest进行查询分析?

使用 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.cnfmy.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 输出的报告通常分为几个部分:

  1. Overall Summary:总结了日志文件中的总体情况,包括总查询数、独特查询数、平均执行时间等。
  2. Top 10 Queries:列出了资源消耗最大的前10个查询,按总执行时间排序。
  3. 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 的分析结果,可以采取以下优化措施:

  1. 创建或优化索引:根据分析结果中显示的频繁查询和慢查询,创建或优化索引。
  2. 优化查询语句:重写具有高执行时间和高锁等待时间的查询,优化查询逻辑。
  3. 调整配置参数:根据查询的执行情况,调整MySQL的配置参数,如缓冲池大小、查询缓存、连接数等。
  4. 分区和分表:对于大表,考虑使用分区或分表策略,以提高查询效率。
  5. 使用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 数据库的性能和稳定性。

相关推荐
bobz96535 分钟前
windows 配置 conda 环境变量
后端
回家路上绕了弯1 小时前
线程池优化实战:从性能瓶颈到极致性能的演进之路
java·后端
bobz9651 小时前
pycharm pro 安装插件失败
后端
丘山子2 小时前
如何规避 A/B Testing 中的致命错误?何时进行 A/B 测试?
前端·后端·面试
用户84913717547163 小时前
JDK 17 实战系列(第4期):安全性与稳定性增强详解
java·后端·性能优化
苏三的开发日记3 小时前
centos如何使用高版本gcc
后端
自由的疯3 小时前
java程序员怎么从Python小白变成Python大拿?(三)
java·后端·trae
用户84913717547163 小时前
JustAuth实战系列(第4期):模板方法模式实战 - AuthDefaultRequest源码剖析
java·后端·架构
lynnss_ai3 小时前
Go + GORM 实现支持嵌套事务的中间件(含事务计数器与日志开关)
后端
_風箏3 小时前
OpenSSH【安装 02】离线升级异常问题解决、无法升级时的失败恢复
后端