使用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.pswp.cn/news/918299.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918299.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918299.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何培养自己工程化的能力(python项目)

培养 Python 项目的工程化能力需要系统性训练,以下从基础到高阶的实践路径,结合具体案例和工具链,帮助你逐步进阶:一、夯实工程化基础能力​1. 规范代码与项目结构•​项目模板化​使用 cookiecutter生成标准项目结构,…

AI编程插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功能特性、性能表现、集成性、用户…

uniapp/uniappx实现图片或视频文件选择时同步告知权限申请目的解决华为等应用市场上架审核问题

在UNIAPP支持vue和nvue,在UNIAPPX支持uvue,安卓支持在选择图片或视频文件权限申请的时候自动同步告知权限申请目的。轻松解决在华为应用市场审核,要求告知权限申请目的或说明的问题。 UNIAPP相册图片视频选择器(安卓可以自定义界面样式)功能介绍&#x…

jupyter notebook如何打开其他盘目录

问题描述Jupyter Notebook 相信是我们学习 Python 避不开的一个工具。当我们使用 pip install notebook 安装 Notebook 之后,使用命令 jupyter notebook 启动服务,启动之后默认会在浏览器打开界面。我们会发现,这个界面默认在 C 盘下&#xf…

C语言深度剖析

一、关键字 1.1 最快的关键字-register register 这个关键字请求编译器尽可能将变量存在CPU内部寄存器中,而不是通过内存寻址以提高效率。 注意是:尽可能、而不是绝对 1.1.1 皇帝身边的小太监-寄存器 不知道什么是寄存器,那见过太监没有其实寄存器就是相当于。一个cpu的…

电脑使用“碎片整理”程序的作用

1.解决文件碎片化问题碎片整理的作用:将这些分散的文件片段重新整理、拼接,使其连续存储在硬盘的某个区域,减少文件的 “碎片化” 程度。2. 提升硬盘读写速度机械硬盘的特殊性:机械硬盘依赖磁头的物理移动来读取数据,若…

AI 软件工程开发 AI 算法 架构与业务

AI 软件工程开发 & AI 算法 & 架构与业务前言1.AI 软件工程开发1.1. AI Developer Studio (playground级)1.2. Agent & RAG1.3. LangChain & LangGraph1.4. MCP, Model Context Protocol1.5. Ollama1.6. Coze & Dify2.AI 算法2.1. G…

uniapp实现的圆形滚盘组件模板

采用 uniapp 实现的一款圆形滚盘示例组件模板, 支持 vue2、vue3,适配H5、微信小程序(其他小程序未试过,可自行尝试) 代码实现简约易懂,用户可根据自身需求下载模板,并进行扩展开发可到插件市场下载尝试&…

无须炮解,打开即是Pro版

聊一聊 文档或文件转图片,这个我有段时间没有推荐了。 今天发现了一款非常好用的图像格式转换编辑软件。 有需要的小伙伴请及时收藏,防止下次找不到。 软件介绍 全能图像格式转换工具 这是一款全能的图像转换软件,支持几乎所有的图像格式…

企业高性能web服务器——Nginx

Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器,也是一个邮件代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。所以其特点是占有内存…

MCU控制ADAU1701,用System Workbench for STM32导入工程

作者的话 MCU控制ADAU1701,我有写一个文档详细讲步骤,里头用到了System Workbench for STM32这个软件,他是基于eclips内核的开发软件,一般来讲,设置好workspce工程就会出来,但是架不住就有设置好工程不出来…

SQL176 每个题目和每份试卷被作答的人数和次数

描述现有试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分):iduidexam_idstart_timesubmit_timescore1100190012021-09-01 09:01:012021-09-01 09:41:01812100290022021-09-01 …

构建第三方软件仓库

1 下载第三方软件到指定目录[rootServer_b ~]# mkdir software [rootServer_b software]# wget https://dldir1v6.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.18_250724_x86_64_01.rpm2 安装软件信息采集工具[rootServer_b software]# yum install createrepo -y [rootServer_b softw…

Linux 管道命令及相关命令练习与 Shell 编程、Tomcat 安装

2.实验目的掌握 Linux 管道命令及相关命令(cut、sort、wc、uniq、tee、tr、split)的使用方法。学会使用 Shell 编程实现基本的计算器功能。掌握在 CentOS 7 系统中安装 Tomcat 的方法。实验内容1. Linux 管道命令及相关命令练习1.1 管道命令定义&#xf…

蓝牙基础:FIFO(First-In-First-Out)缓存区

在蓝牙通信中,FIFO(First-In-First-Out,先进先出)缓存区是解决数据传输中“速度不匹配”和“时序异步”问题的核心机制,广泛应用于蓝牙芯片内部、协议栈各层级及主从设备交互中。其核心作用是临时存储数据,…

国内外主流源代码平台与高效开发指南

摘要 本文旨在为您提供一份实用的源代码获取与开发指南。我们将首先梳理国内外最主流的源代码托管平台,并重点介绍如何利用这些平台上的开源项目。接着,本文将为您规划一条针对初学者的“最快最性价比”的开发路径,从环境配置、项目管理到实…

任务进度状态同步 万能版 参考 工厂+策略+观察者设计模式 +锁设计 springboot+redission

文章目录概要效果解释状态流转说明设计AI任务实体类AI任务状态枚举AI模型枚举基础实体类简单字典接口工厂策略模式 接口设计AiJobProcessorAiJobProcessorFactory观察者模式AI任务相关的EventMyEventListenerMyEventPubLisherRedissonConfig定时任务实现ReplicateJobProcessorR…

printf函数格式化输出攻略

目录 一、基本用法 二、占位符 基本用法 常用占位符 字符串占位符示例 多占位符示例 注意事项 三、占位符列表 基本数据类型占位符 浮点数占位符 特殊类型占位符 长度修饰符 使用示例 注意事项 四、输出格式 1、限定宽度 基本用法 左对齐输出 浮点数宽度限制…

AI小智单片机esps32-s3烧录教程

1. 下载代码到本地 代码地址:https://github.com/78/xiaozhi-esp32 2. vscode安装环境 安装一下这个插件 3. esp32-s3通过数据线连接电脑 【图片】 4. vscode选择对应配置 如果是用自己的服务还得改下地址 5. 点击构建 6. 点击烧录

socket编程中系统调用send()详细讲解

在 socket 编程中,send() 是用于在已连接的套接字上发送数据的系统调用,主要用于 TCP 协议(也可用于 UDP,但需配合连接操作)。它负责将用户态的数据传递到内核缓冲区,再由内核协议栈(如 TCP/IP&…