当前位置: 首页 > news >正文

MySQL(188)如何使用MySQL的慢查询工具?

使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询。以下是详细深入的步骤和代码示例,帮助你使用MySQL的慢查询工具来进行查询分析和优化。

一、启用慢查询日志

首先,你需要确保MySQL的慢查询日志功能是启用的。慢查询日志记录了所有执行时间超过指定阈值的SQL查询。

1.1 编辑MySQL配置文件

编辑my.cnf(Linux)或my.ini(Windows)配置文件,添加或修改以下配置:

[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服务:

sudo systemctl restart mysql  # 对于systemd系统
# 或者
sudo service mysql restart  # 对于init.d系统

二、配置动态参数(可选)

如果无法修改配置文件或者不想重启MySQL服务,也可以动态设置这些参数:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 1;

三、分析慢查询日志

启用慢查询日志后,MySQL会记录执行时间超过long_query_time阈值的查询。你可以使用mysqldumpslow工具或pt-query-digest工具来分析这些日志。

3.1 使用mysqldumpslow工具

mysqldumpslow是MySQL自带的工具,用于分析慢查询日志。

mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log

命令说明:

  • -s:排序方式(t:按照查询时间排序,c:按照次数排序,l:按照锁时间排序,r:按照返回记录数排序)。
  • -t:显示前N条记录。
  • /var/log/mysql/mysql-slow.log:慢查询日志文件的位置。

示例输出:

Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 3  Time=5.00s (15s)  Lock=0.00s (0s)  Rows=10.0 (30), root[root]@localhostSELECT * FROM orders WHERE customer_id = '12345'Count: 2  Time=2.50s (5s)  Lock=0.00s (0s)  Rows=100 (200), root[root]@localhostSELECT * FROM products WHERE price > 1000
3.2 使用pt-query-digest工具

pt-query-digest是Percona Toolkit中提供的强大工具,用于分析慢查询日志。

pt-query-digest /var/log/mysql/mysql-slow.log > slow_query_report.txt

示例输出(部分):

# Overall: 80 total, 10 unique, 0.01 QPS, 0.01x concurrency _______________
# Time range: 2021-10-01 10:00:00 to 2021-10-01 11:00:00
# Attribute    total   min     max     avg     95%  stddev  median
# ============ ======= ======= ======= ======= ======= ======= =======
# Count          80
# Exec time     30s     50ms    2s      375ms   1s    450ms   300ms
# Lock time     1s      0ms     50ms    12ms    25ms  10ms    15ms
# Rows sent     800     1       100     10      50    20      5
# Rows examine  8000    10      500     100     400   150     75

四、优化建议

根据慢查询日志的分析结果,可以采取以下优化措施:

4.1 创建或优化索引

根据分析结果中显示的频繁查询和慢查询,创建或优化索引。

-- 创建索引
CREATE INDEX idx_customer_id ON orders(customer_id);-- 优化查询语句
SELECT * FROM orders WHERE customer_id = '12345';
4.2 优化查询语句

重写具有高执行时间和高锁等待时间的查询,优化查询逻辑。

优化前:

SELECT * FROM products WHERE price > 1000;

优化后(假设创建了索引):

ALTER TABLE products ADD INDEX (price);
SELECT * FROM products WHERE price > 1000;
4.3 使用EXPLAIN分析执行计划

使用EXPLAIN命令进一步分析查询的执行计划,找出优化的具体措施。

EXPLAIN SELECT * FROM orders WHERE customer_id = '12345';

示例输出:

+----+-------------+--------+------------+------+---------------+---------------+---------+-------+------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+---------------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | orders | NULL       | ref  | idx_customer_id | idx_customer_id | 4       | const |    1 |   100.00 | Using index |
+----+-------------+--------+------------+------+---------------+---------------+---------+-------+------+----------+-------------+
4.4 分区和分表

对于大表,考虑使用分区或分表策略,以提高查询效率。

-- 创建分区表
CREATE TABLE orders (order_id INT NOT NULL,order_date DATE NOT NULL,customer_id INT NOT NULL,amount DECIMAL(10, 2) NOT NULL
)
PARTITION BY RANGE (YEAR(order_date)) (PARTITION p0 VALUES LESS THAN (2020),PARTITION p1 VALUES LESS THAN (2021),PARTITION p2 VALUES LESS THAN (2022),PARTITION p3 VALUES LESS THAN MAXVALUE
);

五、监控和调整

  1. 监控工具:使用监控工具,如Prometheus、Grafana、Percona Monitoring and Management (PMM)等,实时监控MySQL性能。
  2. 定期检查:定期检查慢查询日志、错误日志和性能指标,及时发现问题并优化。
  3. 自动化调优:使用自动化调优工具,如MySQL Tuner、Percona Toolkit等,定期进行自动化调优。
5.1 使用MySQL Tuner

下载并运行MySQL Tuner:

wget http://mysqltuner.pl/ -O mysqltuner.pl
chmod +x mysqltuner.pl
./mysqltuner.pl

根据MySQL Tuner的建议调整配置:

[mysqld]
innodb_buffer_pool_size = 8G  # 根据建议调整缓冲池大小
query_cache_size = 512M  # 根据建议调整查询缓存大小

六、总结

通过启用和分析慢查询日志,可以深入了解MySQL查询性能的瓶颈。结合mysqldumpslowpt-query-digest工具的分析结果,可以采取针对性的优化措施,包括创建索引、优化查询语句、调整配置参数等,从而显著提升MySQL数据库的性能和稳定性。通过定期监控和调整,可以确保数据库在高负载和大数据量情况下持续高效运行。

http://www.dtcms.com/a/322568.html

相关文章:

  • 驾驶场景玩手机识别准确率↑32%:陌讯动态特征融合算法实战解析
  • 用生活日常的案例来介绍“程序运行时,对函数的调用一般有两种形式:传值调用和引用调用 和 这两种调用有什么区别?
  • 使用Navicat备份数据库MySQL、PostGreSQL等
  • SqlSugar vs EF Core 对比 2025年 .NET ORM
  • ES6中箭头函数的作用
  • C++-红黑树
  • 电子电气架构 --- 48伏电气系统架构
  • 串扰-信号完整性与电源完整性分析
  • C++安全异常设计
  • 浅尝AI辅助C转Verilog方法
  • 阿里云 ECS 怎么用 nginx 部署80端口多个网站
  • 无印良品:回归本质的管理哲学
  • 海康威视摄像头实时推流到阿里云公网服务器(Windows + FFmpeg + nginx-rtmp)
  • webrtc弱网-BandwidthQualityScaler 源码分析与算法原理
  • Ruoyi-Vue-Plus 修改包名、模块名、项目名
  • MySQL 临时表详细说明
  • 20.万物皆可变身术:状态模式架构全景解析
  • 【Git】Visual Studio 实现合并分支
  • 在 Ubuntu 中测试串口通信:详细指南与实践
  • 【面试场景题】微博热点新闻系统设计方案
  • 容器docker场景下新增接口测试及工具使用方法介绍
  • 人工智能技术发展历史演变
  • Java基础-TCP通信(多发多收和一发一收)
  • 八、Linux Shell 脚本:变量与字符串
  • Dotenv 入门教程
  • 政府数字化大屏系统 - Flask实现方案
  • 上海AI Lab、浙大EagleLab等提出RRVF:利用「验证非对称性」,只输入图片学习视觉推理
  • 接口文档深入解析
  • OpenAI开源大模型 GPT-OSS 开放权重语言模型解析:技术特性、部署应用及产业影响
  • Python基础教程(七)匹配模式:隐藏在结构之美中的编程革命