MySQL 慢查询优化指南

MySQL 慢查询优化指南

在现代数据库管理中,性能优化是一个不可忽视的重要环节。尤其是对于高并发、大数据量的应用,慢查询可能会成为系统的性能瓶颈。本文将介绍如何查看和优化 MySQL 的慢查询,帮助你提高数据库性能。

一、什么是慢查询?

慢查询是指执行时间超过指定阈值的 SQL 查询。在 MySQL 中,可以通过设置 long_query_time 参数来定义这个阈值,默认值为 10 秒。通过启用慢查询日志,我们可以记录这些执行时间过长的查询,以便进行分析和优化。

二、启用慢查询日志

首先,需要确保 MySQL 已启用慢查询日志。可以通过以下命令查看当前配置:

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';

如果未启用,可以通过修改 MySQL 配置文件(通常为 my.cnfmy.ini)来开启慢查询日志,并设置查询时间阈值:

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

然后,重启 MySQL 服务使配置生效:

sudo systemctl restart mysql
三、查看慢查询日志

可以通过登录到数据库服务器,使用文本编辑器(如 vinano)查看慢查询日志文件:

sudo vi /var/log/mysql/slow.log

也可以使用以下 SQL 命令在 MySQL 客户端中直接查看慢查询日志的数量:

SHOW GLOBAL STATUS LIKE 'Slow_queries';
四、分析慢查询日志

假设我们在慢查询日志中发现以下记录:

# Time: 2023-05-16T10:12:34.567890Z
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 12.345678  Lock_time: 0.000123 Rows_sent: 100  Rows_examined: 1000000
SET timestamp=1684230754;
SELECT * FROM orders WHERE status = 'PENDING' AND created_at < '2023-05-01' ORDER BY created_at DESC;
五、优化慢查询

我们需要从以下几个方面来优化这条慢查询:

  1. 检查表结构和索引: 查看 orders 表的结构,尤其是索引情况:

    SHOW CREATE TABLE orders;
    

    输出结果:

    CREATE TABLE `orders` (
    `id` int NOT NULL AUTO_INCREMENT,
    `user_id` int NOT NULL,
    `status` varchar(50) NOT NULL,
    `created_at` datetime NOT NULL,
    `total_amount` decimal(10,2) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `idx_user_id` (`user_id`),
    KEY `idx_status` (`status`),
    KEY `idx_created_at` (`created_at`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
  2. 添加适当的索引: 通过分析查询条件和排序需求,添加复合索引以提高查询效率:

    ALTER TABLE orders ADD INDEX idx_status_created_at (status, created_at);
    
  3. 使用 EXPLAIN 命令: 执行优化后的查询,查看执行计划:

    EXPLAIN SELECT * FROM orders WHERE status = 'PENDING' AND created_at < '2023-05-01' ORDER BY created_at DESC;
    

    假设 EXPLAIN 输出如下:

    +----+-------------+--------+------------+-------+---------------+------------------------+---------+------+-------+-------------+
    | id | select_type | table  | partitions | type  | possible_keys | key                    | key_len | ref  | rows  | Extra       |
    +----+-------------+--------+------------+-------+---------------+------------------------+---------+------+-------+-------------+
    |  1 | SIMPLE      | orders | NULL       | ref   | idx_status_created_at | idx_status_created_at | 767     | const| 1000  | Using where |
    +----+-------------+--------+------------+-------+---------------+------------------------+---------+------+-------+-------------+
    

    通过 EXPLAIN 输出,可以看到查询计划使用了我们新添加的索引 idx_status_created_at,并且 typeref,说明索引查找相对高效。

以下是 EXPLAIN 命令输出中 type 列的各个等级及其含义,以表格的形式展示:

Type含义性能示例
system表仅有一行(系统表)。最理想SELECT * FROM dual;
const表中最多有一行匹配查询条件,通常是通过主键或唯一索引来查找。非常快速SELECT * FROM table WHERE primary_key = 1;
eq_ref对每个从表的记录,主表中只有一条匹配记录。良好SELECT * FROM table1 JOIN table2 ON table1.primary_key = table2.foreign_key;
ref对于从表的每一行,从主表中匹配到多行。较好SELECT * FROM table WHERE indexed_column = 'value';
ref_or_null类似于 ref,但还包括了对 NULL 值的检查。较好SELECT * FROM table WHERE indexed_column = 'value' OR indexed_column IS NULL;
index_merge查询使用了多个索引的合并。SELECT * FROM table WHERE indexed_column1 = 'value1' OR indexed_column2 = 'value2';
range只检索表中给定范围的行,使用索引查找。一般SELECT * FROM table WHERE indexed_column BETWEEN 10 AND 20;
index全索引扫描,类似全表扫描,但只扫描索引树。一般SELECT indexed_column FROM table;
all全表扫描。最差SELECT * FROM table;

在实际应用中,通过理解和优化 EXPLAIN 输出中的 type 类型,能够显著提高查询性能。对于性能要求高的查询,应该尽量避免使用 typeallindex,并尽量使用索引以提高查询效率。

  1. 检查查询性能: 再次执行查询,检查执行时间是否明显减少。如果查询性能仍然不理想,可以考虑进一步优化查询逻辑或重新设计表结构。
六、进一步优化建议
  • 优化查询逻辑: 重新评估查询逻辑,确保没有不必要的复杂性。例如,避免在 WHERE 子句中使用不必要的函数调用或复杂表达式。
  • 拆分查询: 如果数据量非常大,可以考虑将查询拆分成多个小查询,分批处理。例如,使用分页技术(LIMIT 和 OFFSET)分批读取数据。
  • 优化表设计: 重新设计表结构,避免过多的复杂性。确保数据存储和访问的高效性。例如,规范化表设计,避免冗余数据。
七、总结

通过启用和分析慢查询日志,我们可以有效地识别和解决 MySQL 慢查询问题。优化慢查询通常需要检查表结构、添加适当的索引、优化查询逻辑,以及必要时重新设计表结构。通过这些步骤,可以显著提高数据库性能,确保系统的高效运行。

希望这篇博客能帮助你理解和优化 MySQL 慢查询。如果你有任何问题或建议,欢迎在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/18450.shtml

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

相关文章

C语言 | Leetcode C语言题解之第118题杨辉三角

题目&#xff1a; 题解&#xff1a; int** generate(int numRows, int* returnSize, int** returnColumnSizes) {int** ret malloc(sizeof(int*) * numRows);*returnSize numRows;*returnColumnSizes malloc(sizeof(int) * numRows);for (int i 0; i < numRows; i) {re…

C#实现计算数据和刷新ListView列表并发执行

下面是一个示例代码&#xff0c;演示如何在C#中实现计算列表的数据和刷新ListView控件的数据的并发执行&#xff1a; using System; using System.Collections.Generic; using System.Threading; using System.Windows.Forms;class Program {static List<int> dataList …

前端API: IntersectionObserver的那一二三件事

IntersectionObserver 基础 IntersectionObserver 可以监听一个元素和可视区域相交部分的比例&#xff0c;然后在可视比例达到某个阈值的时候触发回调。比如可以用来处理图片的懒加载等等 首先我们来看下基本的格式&#xff1a; const observer new IntersectionObserver(c…

yolov10 使用自己的数据集训练目标检测模型

1 环境配置(使用anaconda) conda create -n yolov10 python=3.9 //创建虚拟环境 conda activate yolov10 //激活虚拟环境 pip install -r requirements.txt //执行yolov10 路径下requirements.txt 安装依赖 pip install -e .2.数据集制作 使用lableImage制作数据集(win版…

华为云Astro Zero低代码平台案例:小、轻、快、准助力销售作战数字化经营

客户背景&#xff1a; 随着业务的不断扩展&#xff0c;华为云某一线作战团队发现&#xff0c;原本基于线上Excel的项目跟踪方式面临新的挑战&#xff1a;多区域、多场景下的业务管理越来越复杂&#xff0c;项目管道存在多种不可控因素&#xff0c;客户关系、进展跟踪同步不及时…

【Qt秘籍】[003]-Qt环境变量配置-磨刀不误砍柴工

一、为什么要设置环境变量 &#xff1f;[原因] 配置PATH环境变量的主要用处在于让操作系统能够识别并执行不在当前工作目录下的可执行文件。具体来说&#xff0c;它的作用包括&#xff1a; 命令执行便捷性&#xff1a;当你在命令行输入一个命令&#xff08;如java, python或np…

【Unity程序】Unity游戏开发中常用的设计模式【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【C语言习题】26.字符逆序

文章目录 1.描述2.解题思路3.具体代码 1.描述 输入描述: 将一个字符串str的内容颠倒过来&#xff0c;并输出。可以有空格 数据范围&#xff1a;1≤&#x1d459;&#x1d452;&#x1d45b;(&#x1d460;&#x1d461;&#x1d45f;)≤10000 1≤len(str)≤10000 输出描述&…

Android基础-数据库

在Android系统中&#xff0c;数据库扮演着至关重要的角色&#xff0c;它负责存储、管理和检索应用程序所需的数据。随着移动应用的日益复杂和功能的不断增加&#xff0c;对数据库的需求也日益提高。在Android中&#xff0c;有多种数据库管理系统和工具可供选择&#xff0c;其中…

NDIS协议驱动(四)

NDIS 定义对象标识符 (OID) 值&#xff0c;以标识适配器参数&#xff0c;其中包括设备特征、可配置设置和统计信息等操作参数。 协议驱动程序可以查询或设置基础驱动程序的操作参数。 NDIS 还为 NDIS 6.1 及更高版本的协议驱动程序提供直接 OID 请求接口。 直接 OID 请求路径支…

利用EasyCVR视频智能监控技术,构建智慧化考场监管体系

随着科技的进步&#xff0c;视频监控在各个领域的应用越来越广泛&#xff0c;其中在考场中的应用尤为显著。视频监控不仅能够提高考场的监管水平&#xff0c;确保考试的公平、公正和公开&#xff0c;还能有效预防和打击作弊行为&#xff0c;为考生营造一个良好的考试环境。 传…

前后端分离跨域问题解决方案

Vue和SpringBoot的跨域问题的4中解决方案 跨域问题产生的原因&#xff1a;浏览器的保护机制&#xff0c;同源策略协议&#xff0c;域名&#xff0c;端口&#xff1b;三个中有一个不同就会产生跨域问题 解决方案&#xff08;后端&#xff09;&#xff1a; 1.CrossOrigin注解&…

界面控件DevExtreme v23.2亮点 - 标签、表单、编辑器功能升级

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

脑图工具 在学习系统架构中的使用

系统&#xff0c;有人把它比作一个黑盒&#xff0c;有人比作一个树洞。呃&#xff0c;其实二者都隐含的表达了一个意思&#xff0c;盘根错节&#xff0c;一言难尽&#xff0c;欲说还休&#xff0c;说了又像是隔靴搔痒&#xff0c;感觉没说透。 学习&#xff0c;理解和展示一个…

计算机组成原理----移码

在网上搜索移码是什么,大概率会搜到一个结论:移码是补码符号位取反,可是真的是这样吗? 传统的有符号整数是将二进制数的首位作为符号位,0表示正数,1表示负数。 但在移码中,我们不再使用单独的符号位来表示正负。而是通过一个固定的偏置量来将所有可能的指数值映射到一个无符…

力扣每日一题 5/28

题目&#xff1a;2951-找出峰值 给你一个下标从 0 开始的数组 mountain 。你的任务是找出数组 mountain 中的所有 峰值。 以数组形式返回给定数组中 峰值 的下标&#xff0c;顺序不限 。 注意&#xff1a; 峰值 是指一个严格大于其相邻元素的元素。数组的第一个和最后一个元…

C语言.顺序表.通讯录

基于顺序表示实现通讯录 1.通讯录项目的功能要求2.代码实现3.头文件处理4.通讯录的具体实现4.1通讯录的初始化与销毁4.1.1通讯录的初始化4.1.2通讯录的初始化销毁 4.2通讯录的添加与删除数据4.2.1通讯录的添加数据4.2.1通讯录的删除数据 4.3通讯录的修改4.4通讯录的查找4.5通讯…

熟悉电脑快捷键(包含部分VS)

有很多不太电脑的小白&#xff0c;这里给大家一些常用快捷键&#xff0c;希望帮助到大家学习~ ctrl c 复制&#xff08;保留原内容&#xff09; ctrl v 粘贴 ctrl x 剪切&#xff08;跟复制不一样的地方在于原内容清空&#xff09; ctrl z …

【python】OpenCV—Tracking(10.2)

文章目录 BackgroundSubtractorcreateBackgroundSubtractorMOG2createBackgroundSubtractorKNN BackgroundSubtractor Opencv 有三种背景分割器 K-Nearest&#xff1a;KNN Mixture of Gaussian&#xff08;MOG2&#xff09; Geometric Multigid&#xff08;GMG&#xff09; …

AURIX TC3xx单片机介绍-启动过程介绍2

AURIX TC377,TC387,TC397用户启动程序流程 用户启动程序是在Boot Firmware之后运行的程序(即用户程序里的第一级Boot Loader,类似Linux的Uboot),初始化过程是CPU0完成的。用户可以根据不同的复位事件来选择不同的执行路径。 AURITX 2代芯片的主要启动过程如下(该阶段只…