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

相关推荐
做运维的阿瑞3 小时前
Python零基础入门:30分钟掌握核心语法与实战应用
开发语言·后端·python·算法·系统架构
猿究院-陆昱泽4 小时前
Redis 五大核心数据结构知识点梳理
redis·后端·中间件
yuriy.wang4 小时前
Spring IOC源码篇五 核心方法obtainFreshBeanFactory.doLoadBeanDefinitions
java·后端·spring
咖啡教室6 小时前
程序员应该掌握的网络命令telnet、ping和curl
运维·后端
你的人类朋友7 小时前
Let‘s Encrypt 免费获取 SSL、TLS 证书的原理
后端
老葱头蒸鸡7 小时前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
李昊哲小课7 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端
码事漫谈8 小时前
C++内存越界的幽灵:为什么代码运行正常,free时却崩溃了?
后端
Swift社区8 小时前
Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
java·spring boot·后端
90后的晨仔8 小时前
Mac 上配置多个 Gitee 账号的完整教程
前端·后端