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 数据库的性能和稳定性。

相关推荐
Marktowin4 小时前
Mybatis-Plus更新操作时的一个坑
java·后端
赵文宇4 小时前
CNCF Dragonfly 毕业啦!基于P2P的镜像和文件分发系统快速入门,在线体验
后端
程序员爱钓鱼4 小时前
Node.js 编程实战:即时聊天应用 —— WebSocket 实现实时通信
前端·后端·node.js
Libby博仙5 小时前
Spring Boot 条件化注解深度解析
java·spring boot·后端
源代码•宸6 小时前
Golang原理剖析(Map 源码梳理)
经验分享·后端·算法·leetcode·golang·map
小周在成长6 小时前
动态SQL与MyBatis动态SQL最佳实践
后端
瓦尔登湖懒羊羊6 小时前
TCP的自我介绍
后端
小周在成长6 小时前
MyBatis 动态SQL学习
后端
子非鱼9216 小时前
SpringBoot快速上手
java·spring boot·后端