当前位置: 首页 > 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.lryc.cn/news/615063.html

相关文章:

  • Spring Boot 2 集成 Redis 集群详解
  • 聊聊经常用的微服务
  • MBR分区nvme固态硬盘安装win7--非UEFI启动和GPT分区
  • day30-HTTP
  • 大语言模型提示工程与应用:LLMs文本生成与数据标注实践
  • 在Docker中下载RabbitMQ(详细讲解参数)
  • docker基础前置
  • STM32H503不同GPIO速度配置(HAL库)对应的最高速度
  • 【linux基础】Linux 文本处理核心命令指南
  • 麒麟系统 安装vlc
  • NumPy性能飞跃秘籍:向量化计算如何提升400倍运算效率?
  • Pytorch模型复现笔记-FPN特征金字塔讲解+架构搭建(可直接copy运行)+冒烟测试
  • 工业场景反光衣识别准确率↑32%:陌讯多模态融合算法实战解析
  • 【阿里巴巴大数据实践之路学习记录】第十章-维度设计
  • 强化学习-MATLAB
  • bms部分
  • Day38 Dataset和Dataloader类
  • 强光干扰下误报率↓82%!陌讯多模态算法在睡岗检测的落地优化
  • 分享一个基于Spark的眼科疾病临床数据可视化分析与应用研究Hadoop基于Vue和Echarts的眼科疾病统计数据交互式可视化系统的设计与实现
  • JS逆向实战案例之----【通姆】252个webpack模块自吐
  • ComfyUI——舒服地让大模型为我所用
  • QT第二讲-信号和槽
  • Openlayers基础教程|从前端框架到GIS开发系列课程(19)地图控件和矢量图形绘制
  • 【C++详解】AVL树深度剖析与模拟实现(单旋、双旋、平衡因⼦更新、平衡检测)
  • Windows浮动ip怎么配置
  • Tob大客户销售面试经验
  • JVM相关(AI回答)
  • LeetCode 刷题【36. 有效的数独】
  • LangChain
  • Excel函数 —— SEARCH 文本中查找子字符串