MySQL(66)如何进行慢查询日志分析?

慢查询日志分析是数据库优化的重要步骤,能够帮助我们识别和优化执行时间较长的查询,从而提升数据库的性能。以下是如何进行 MySQL 的慢查询日志分析的详细步骤和代码示例。

1. 启用慢查询日志

首先,我们需要确保 MySQL 的慢查询日志功能是启用的。

1.1 修改 MySQL 配置文件

编辑 MySQL 配置文件 my.cnfmy.ini,添加或修改以下配置项:

ini 复制代码
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1  # 设置慢查询的阈值,单位是秒
log_queries_not_using_indexes = 1  # 记录不使用索引的查询

1.2 重启 MySQL 服务

完成配置后,重启 MySQL 服务以使配置生效:

bash 复制代码
sudo systemctl restart mysql

1.3 验证慢查询日志配置

进入 MySQL 命令行工具,执行以下命令以检查配置是否生效:

sql 复制代码
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';

2. 查看慢查询日志

慢查询日志的默认位置通常是 /var/log/mysql/mysql-slow.log。可以使用以下命令查看慢查询日志:

bash 复制代码
sudo less /var/log/mysql/mysql-slow.log

3. 使用 mysqldumpslow 工具分析慢查询日志

MySQL 提供了一个名为 mysqldumpslow 的工具,用于分析慢查询日志。mysqldumpslow 可以对日志进行汇总和排序,找出最慢的查询。

3.1 基本用法

以下是一些常用的 mysqldumpslow 命令:

  • 显示前 10 个最慢的查询
bash 复制代码
mysqldumpslow -t 10 /var/log/mysql/mysql-slow.log
  • 按查询时间排序
bash 复制代码
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
  • 按查询次数排序
bash 复制代码
mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
  • 按锁定时间排序
bash 复制代码
mysqldumpslow -s l -t 10 /var/log/mysql/mysql-slow.log
  • 按返回行数排序
bash 复制代码
mysqldumpslow -s r -t 10 /var/log/mysql/mysql-slow.log

3.2 示例输出

以下是 mysqldumpslow 的示例输出:

bash 复制代码
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 5  Time=2.00s (10s)  Lock=0.00s (0s)  Rows=10.0 (50), root[root]@localhost
  SELECT * FROM employees WHERE emp_no = 'S'

Count: 3  Time=1.00s (3s)  Lock=0.00s (0s)  Rows=1.0 (3), user[user]@example.com
  UPDATE salaries SET salary = N WHERE emp_no = N

4. 使用第三方工具进行慢查询分析

除了 mysqldumpslow,还有一些第三方工具可以帮助进行更深入的慢查询日志分析,如 Percona Toolkit 中的 pt-query-digest

4.1 安装 Percona Toolkit

首先安装 Percona Toolkit:

bash 复制代码
sudo apt-get install percona-toolkit  # 对于 Debian/Ubuntu 系统
sudo yum install percona-toolkit  # 对于 RedHat/CentOS 系统

4.2 使用 pt-query-digest 分析慢查询日志

使用 pt-query-digest 分析慢查询日志:

bash 复制代码
pt-query-digest /var/log/mysql/mysql-slow.log > slow_query_report.txt

4.3 示例输出

以下是 pt-query-digest 的示例输出:

plaintext 复制代码
# 180ms user time, 60ms system time, 29.00M rss, 2.66G vsz
# Current date: Thu Dec 16 12:34:56 2021
# Hostname: server1
# Files: /var/log/mysql/mysql-slow.log
# Overall: 2 total, 1 unique, 0 QPS, 0x concurrency ________________
# Time range: 2021-12-16 12:34:56 to 2021-12-16 12:34:58
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ ===  =======  =======  =======  =======  =======  =======  =======
# Exec time     99     0.10s    0.05s    0.05s    0.05s    0.05s       0.00ms
# Lock time      0       0s       0s       0s       0s       0s       0.00ms
# Rows sent     50      100       50       50       50       50       0.00
# Rows examine  50      100       50       50       50       50       0.00
# Query size    90     1.00k     1.00k     1.00k     1.00k     1.00k       0.00
# InnoDB:
# IO r bytes    50  100.00k  50.00k  50.00k  50.00k  50.00k       0.00
# IO r wait     50   100.00   50.00   50.00   50.00   50.00       0.00

# Profile
# Rank Query ID           Response time Calls   R/Call V/M Item
# ==== ================== ============= ======= ====== ============
#    1 0x123456789ABCDEF   0.1000       2       0.1000 SELECT employees

5. 优化慢查询

通过慢查询日志分析,确定需要优化的查询。常见的优化方法包括:

  • 添加索引:确保查询涉及的列有合适的索引。
  • 优化查询语句:重写复杂的查询语句,使其执行效率更高。
  • 分区表:对于大表,可以考虑使用表分区。
  • 调整数据库参数 :优化 MySQL 配置参数,如 innodb_buffer_pool_size 等。

5.1 示例优化

假设我们发现以下查询速度较慢:

sql 复制代码
SELECT * FROM employees WHERE emp_no = '10001';

此查询没有使用索引,我们可以为 emp_no 列添加索引:

sql 复制代码
CREATE INDEX idx_emp_no ON employees(emp_no);

小结

通过启用和分析慢查询日志,可以识别和优化性能较差的查询,从而提高数据库整体性能。使用 MySQL 自带的工具 mysqldumpslow 或第三方工具 pt-query-digest,可以更高效地分析慢查询日志,进而进行针对性的优化。

相关推荐
无籽西瓜a1 小时前
【西瓜带你学设计模式 | 第五期 - 建造者模式】建造者模式 —— 产品构建实现、优缺点与适用场景及模式区别
java·后端·设计模式·软件工程·建造者模式
小江的记录本1 小时前
【Spring注解】Spring生态常见注解——面试高频考点总结
java·spring boot·后端·spring·面试·架构·mvc
程序员cxuan2 小时前
来了来了,Claude Code 全架构解析 !!!
人工智能·后端·claude
艾莉丝努力练剑2 小时前
【Linux信号】Linux进程信号(下):可重入函数、Volatile关键字、SIGCHLD信号
linux·运维·服务器·c++·人工智能·后端·学习
常利兵2 小时前
Spring Boot 实现网络限速:让流量“收放自如”
网络·spring boot·后端
掘金者阿豪2 小时前
Claude Code“泄漏源码”曝光:Anthropic 最强终端 AI,原来早就不是聊天工具了
后端
无籽西瓜a2 小时前
【西瓜带你学设计模式 | 第七期 - 适配器模式】适配器模式 —— 类适配器与对象适配器实现、优缺点与适用场景
java·后端·设计模式·软件工程·适配器模式
前端付豪2 小时前
实现消息级操作栏
前端·人工智能·后端
计算机学姐2 小时前
基于SpringBoot的新能源充电桩管理系统
java·vue.js·spring boot·后端·mysql·spring·java-ee
瑶山3 小时前
SpringBoot + MongoDB 5分钟快速集成:从0到1实操指南
java·数据库·spring boot·后端·mongodb