在MySQL拿到一条慢SQL语句要如何优化?

在工作的过程中,很多时候会发现执行业务逻辑的时候,某一条SQL语句执行得非常慢。这时候,要如何处理这条语句,如何判断语句慢的地方在哪里?

一、初级排查 EXPLAIN+慢SQL分析

MySQL官网用法:
https://dev.mysql.com/doc/refman/8.4/en/explain.html
{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] [schema_spec]
select_statement = [SELECT,UPDATE,DELETE,INSERT,REPLACE,TABLE]
schema_spec = {SCHEMA/DATABASE}
FORMAT = {JSON/TREE}

基础用法为:EXPLAIN SELECT * FROM XXX 执行语句的默认返回结果是tabular format

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra

字段解释:

1. id
定义: SELECT 查询的唯一标识符,每个 SELECT 子句分配一个独立 ID。
规则:
相同 ID:执行顺序从上到下(如简单 JOIN)。
不同 ID:数值越大优先级越高,越先执行(常见于嵌套子查询)。

2. select_type
定义: 查询类型,反映 SQL 的复杂度。
常见值:
SIMPLE:不含子查询或 UNION 的简单查询。
PRIMARY:最外层 SELECT(如含子查询的主查询)。
SUBQUERY:WHERE 或 HAVING 中的子查询。
DERIVED:FROM 子句中的子查询(临时表)。
UNION:UNION 操作的第二个或后续 SELECT。

3. table
定义: 当前查询涉及的表名或别名。
特殊情况:
<derivedN>:表示第 N 个子查询生成的临时表。
<unionM,N>:UNION 合并结果的临时表。

4. partitions
定义: 匹配的分区名称(仅当表使用分区时显示)。
示例: p0,p1 表示查询命中了分区 p0 和 p1。

5. type
定义: 表的访问方式,性能关键指标,从优到劣排序:
system > const > eq_ref > ref > range > index > ALL。
优化目标: 至少达到 range 级别,推荐 ref 或更高。

6. possible_keys
**定义:**理论上可能使用的索引列表(基于查询条件和表结构)。
注意: 可能为空(如全表扫描),但实际使用索引由 key 字段决定。

7. key
定义: 实际使用的索引名称。
特殊情况: NULL 表示未使用索引;PRIMARY 表示使用主键。

8. key_len
定义: 索引使用的字节数,反映索引字段的实际利用率。
规则:
数值越大,使用的索引字段越多。
根据字段类型和长度计算(如 INT 为 4 字节,可为 NULL 时 +1 字节)。

9. ref
定义: 与索引比较的列或常量。
常见值:
const:常量值(如 WHERE id=1)。
列名:关联查询中另一表的列(如 t1.col )。

10. rows
定义: MySQL 预估需要扫描的行数(基于统计信息)。
优化参考: 数值越小越好,若过大需检查索引或条件过滤。

11. filtered
定义: 经 WHERE 条件过滤后剩余行数的百分比。
示例: filtered=10% 表示预估 90% 数据被过滤。

12. Extra
定义: 额外执行信息,常见值及优化建议:
- Using filesort:需外部排序(建议添加索引优化 ORDER BY)。
- Using temporary:使用临时表(常见于GROUP BY,需优化查询或索引)。
- Using index:覆盖索引(无需回表,性能最佳)。
- Using where:WHERE条件过滤数据。

在以上的各个字段中,可以有限考虑分析Type与Extra这两个字段,如果无法分析出结果,再考虑其他字段。


除了使用基本的语法,还可以使用 EXPLAIN ANALYZE SELECT * xxx 这句语句会直接帮你分析语句的内容。
在这里插入图片描述

参数含义示例值说明
Table scan on user_login_logs执行计划类型:全表扫描(未使用索引,逐行遍历表数据)当前查询未命中索引,导致必须扫描整张表
cost=479916预估总成本:基于统计信息计算的资源消耗(包含CPU、IO等加权值成本单位是虚拟值,数值越大表示资源消耗越高
rows=4.68e+6预估扫描行数:优化器预测需要扫描的行数(基于数据分布统计)预计扫描468万行,与实际值(470万)误差约0.4%,说明统计信息较准确
actual time=0.0512…1585实际耗时:单位毫秒,0.0512为获取第一行的时间,1585为扫描全表总耗时首次数据返回极快,但全量扫描耗时1.585秒,可能引发性能瓶颈
rows=4.7e+6实际扫描行数:执行时真实处理的数据量实际扫描470万行,与预估基本一致,说明表体积较大
loops=1循环次数:该操作执行的总轮次(通常为1)单次全表扫描,无嵌套循环操作

全表扫描代价高
问题:未使用索引导致强制扫描全表,消耗大量I/O和CPU资源6。
验证:检查查询条件(如WHERE子句)是否涉及未索引字段,或索引选择性不足。

高成本与实际耗时匹配
现象:cost=479916与actual time=1585ms均表明操作代价极高。
根因:表数据量大(470万行),且无有效过滤条件或索引支持。

首次返回延迟低但总耗时长
特征:0.0512ms首行返回快,但全量处理需1.5秒,适合分批读取场景(如分页)。


二、慢查询日志分析

1、开启慢查询日志

show VARIABLES like '%slow_query_log%'
set GLOBAL slow_query_log = 1+-------------+-----+
|Variable_name      |value|
|slow_query_log     | ON  |
|slow_query_log_file| XXX |
+-------------+-----+show GLOBAL STATUS like '%Slow_queries%'
+-------------+-----+
|Slow_queries |  0  |
+-------------+-----+show GLOBAL VARIABLES like '%long_query_time%'
set GLOBAL long_query_time = 2
+-------------+-----+
|long_query_time |  2.0000  |
+-------------+-----+

2、捕获慢查询SQL

使用 mysqldumpslow 工具统计高频慢 SQL

root > mysqldumpslow -s t -t 10 /path/to/slow.log   

三、SHOW PROFILE 深度分析

1、开启性能分析:

show variables profiling;
set profiling = 1

2、执行目标SQL语句,查看耗时分布:

SHOW PROFILES;  
SHOW PROFILE CPU, BLOCK IO FOR QUERY [QUERY_ID];  

在这里插入图片描述

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

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

相关文章

leetcode hot 100 239. 滑动窗口最大值

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输…

Leetcode 189: 轮转数组

Leetcode 189: 轮转数组 这是一道经典问题&#xff0c;题目要求将一个数组向右轮转 k 个位置&#xff0c;有多种解法可以快速求解&#xff0c;既可以通过额外空间&#xff0c;也可以在 O(1) 的空间复杂度内完成。本题考察数组操作、双指针&#xff0c;以及算法优化能力。 题目…

优选算法的智慧之光:滑动窗口专题(二)

专栏&#xff1a;算法的魔法世界​​​​​​ 个人主页&#xff1a;手握风云 目录 一、例题讲解 1.1. 最大连续1的个数 III 1.2. 找到字符串中所有字母异位词 1.3. 串联所有单词的子串 1.4. 最小覆盖子串 一、例题讲解 1.1. 最大连续1的个数 III 题目要求是二进制数组&am…

Linux系统安装Azure CLI完全指南

引言 Azure CLI是管理Azure云服务的重要命令行工具。本文将详细介绍在Linux系统上安装Azure CLI的两种方法,并提供版本管理、故障排除等完整解决方案。 © ivwdcwso (ID: u012172506) 一、安装前准备 1.1 系统要求 支持的Linux发行版: Ubuntu 20.04/22.04 LTSDebian 10/…

2025嵌入式软件开发工程师--音频方向

一、选择题&#xff08;每题3分&#xff0c;共30分&#xff09; 1.以下哪个不是C语言中的关键字?&#xff08; &#xff09; A. int B. Float C. Define D. Return 2.以下代码的输出是: &#xff08; &#xff09; inta 5, b 10; printf("%d“, a b); A. 15 B.16 …

TCP/IP四层模型:从入门到精通

第一部分&#xff1a;基础概念 1.1 什么是TCP/IP&#xff1f; - TCP/IP 是互联网的基础通信协议簇&#xff0c;定义了数据如何在网络中传输和路由。 - 与OSI七层模型的对比&#xff1a;TCP/IP更简化&#xff0c;分为四层&#xff0c;注重实际应用。 1.2 四层模型结构 1. 应…

【Python 数据结构 1.零基础复习】

目录 一、输入与输出 1.输入 2.格式化输出 二、数字与变量 1.字符串 & 整型 2.字符串 & 整型 & 浮点型 3.变量 练习 2235. 两整数相加 三、运算与操作 1.四则运算 练习 2769. 找出最大的可达成数字 3.取整与取余 练习 2651. 计算列车到站时间 ​编辑 四、真与假 1…

什么是 MGX:MetaGPT

什么是 MGX:MetaGPT MetaGPT是由思码逸(OpenDILab)团队开发的一款专注于生成式AI驱动的软件开发框架,MGX可能是其衍生或升级的相关成果,它创新性地将大语言模型引入软件开发流程,模拟人类软件团队的协作方式,能让用户通过自然语言描述需求,即可自动生成完整的软件项目,…

大模型时代下的数据标注革命:工具、挑战与未来趋势

引言 随着大模型技术的飞速发展&#xff0c;人工智能对高质量标注数据的依赖愈发显著。传统的人工标注方式在效率、成本和场景适应性上逐渐显现瓶颈&#xff0c;而大模型凭借其强大的泛化能力和多模态理解能力&#xff0c;正在推动数据标注从“劳动密集型”向“智能工业化”转…

【azure openai】用tts实现语音对话【demo】

能实现&#xff1a; 只要替换里面的key&#xff0c;就能跑通。 key的查找方法&#xff1a; 【保姆级教程】如何在azure里快速找到openai的key和demo-CSDN博客 代码结构&#xff1a; azure_openai_client.py main.py prompts_config.py speech_utils.py stt01.py tts01.…

Spark(5)host配置

&#xff08;一.)host配置的作用&#xff1a; hosts 文件是一个本地的文本文件&#xff0c;它的作用是将主机名映射到对应的 IP 地址&#xff0c;在 DNS&#xff08;域名系统&#xff09;解析之前&#xff0c;系统会先查询 hosts 文件来确定目标主机的 IP 地址。 &#xff08;二…

Hive-04之存储格式、SerDe、企业级调优

一、主题 hive表的数据压缩和文件存储格式hive的自定义UDF函数hive的JDBC代码操作hive的SerDe介绍和使用hive的优化 二、要点 1. hive表的文件存储格式 Hive支持的存储数的格式主要有&#xff1a;TEXTFILE&#xff08;行式存储&#xff09; 、SEQUENCEFILE(行式存储)、ORC&…

Excel的行高、列宽单位不统一?还是LaTeX靠谱

想要生成田字格、米字格、带拼音标准&#xff0c;方便小学生书法和练字。Word&#xff0c;Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时&#xff0c;如果没有专用模板、奇奇怪怪的插件&#xff0c;使用起来会碰到各种问题。比如&#xff0c;Word里面用…

[免费]微信小程序(校园)二手交易系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(校园)二手交易系统(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(校园)二手交易系统(uni-appSpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bi…

【详细讲解在STM32的UART通信中使用DMA机制】

详细讲解在STM32的UART通信中使用DMA机制 目录 详细讲解在STM32的UART通信中使用DMA机制一、DMA机制概述二、DMA在UART中的作用三、DMA的配置步骤四、UART初始化与DMA结合五、DMA传输的中断处理六、DMA与中断的结合使用七、注意事项与常见问题八、代码示例九、总结 一、DMA机制…

M系列芯片 MacOS 在 Conda 环境中安装 TensorFlow 2 和 Keras 3 完整指南

目录 1. 引言2. 环境准备3. 安装 TensorFlow 和必要依赖4. 结语Reference 1. 引言 Keras 是搞深度学习很可爱的工具&#xff0c;其友好的接口让我总是将其作为搭建模型原型的首选。然而&#xff0c;当我希望在 M 系列芯片的MacBook Pro上使用 Keras时&#xff0c;使用Conda和P…

清华北大DeepSeek六册

「清华北大-Deepseek使用手册」 链接&#xff1a;https://pan.quark.cn/s/98782f7d61dc 「清华大学Deepseek整理&#xff09; 1&#xff0d;6版本链接&#xff1a;https://pan.quark.cn/s/72194e32428a AI学术工具公测链接:https://pan.baidu.com/s/104w_uBB2F42Da0qnk78_ew …

paddlehub hub TypeError 错误

pip install paddlehub hub install chinese_ocr_db_crnn_mobile 提示错误&#xff1a; TypeError: Descriptors cannot be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc > 3.19.0…

零信任沙箱:为网络安全筑牢“隔离墙”

在数字化浪潮汹涌澎湃的今天&#xff0c;网络安全如同一艘船在波涛汹涌的大海中航行&#xff0c;面临着重重挑战。数据泄露、恶意软件攻击、网络钓鱼等安全威胁层出不穷&#xff0c;让企业和个人用户防不胜防。而零信任沙箱&#xff0c;就像是一座坚固的“隔离墙”&#xff0c;…

【String】917. 仅仅反转字母

917. 仅仅反转字母 - 力扣&#xff08;LeetCode&#xff09; 使用双指针&#xff0c;一个指针指向s的开始&#xff0c;一个指向s的末尾&#xff0c;同时遍历即可。