mysql性能优化-explain

MySQL Explain:全面解析 SQL 执行计划与性能优化技巧 引言随着大数据时代的到来,数据库的性能已成为企业数据管理的核心竞争力。在这种背景下,MySQL作为开源数据库的佼佼者,承载了大量企业级应用。要优化数据库性能,首先必须深入了解SQL查询的执行计划。MySQL中的EXPLAIN语句正是帮助我们分析SQL执行计划的利器,通过它可以提前预测查询的执行效率,并为优化SQL提供指导。本文将深入探讨如何使用EXPLAIN分析SQL执行计划,揭示数据库性能瓶颈,提供实践中的优化技巧和前沿代码。 阅读详情
一、id:select查询的序号,包含一组数字,表示查询中执行select字句或者操作顺序。
1、id相同,自上到下顺序执行;
2、id不同,序号大的先执行;
3、id相同不同共存,序号大的先执行,相同的顺序执行;
二、select_type: 查询类型,主要用于区别普通查询、联合查询、子查询等复杂查询
常见simple、primary、subquery、derived、union、union result六种
1、simple:简单的select查询,查询中不包含子查询或者union;
2、primary:查询中若包含任何复杂的子部分,最外层查询则被标记为primary;
3、subquery:在select或者where列表中包含子查询;
4、derived:在from列表中包含的子查询被标记为derived,
mysql会递归执行这些子查询,把结果放在临时表中,临时表会增加系统负担;
5、union:若第二个select出现在union之后,则被标记为union;
若union包含在from字句的查询中,外层select将被标记为:derived;
6、union result:从union表获取的select;
三、table:这行数据关于哪张表。
四、type:
system > const > eq_ref > ref > range > index > all
一般来说,得保证查询至少达到range级别,最好能达到ref
system 表只有一行记录(系统表)
const 表示通过索引一次就可以找到了,const用于比较primary key或者unique列索引。因为只匹配一行数据,所以很快
如:将primary key放置wehere中
eq_ref 唯一性索引扫描。对于每个索引键,表中只有一条记录与之匹配,常见于主键或者唯一索引扫描
explain select au.user_name, an.unit_name  from acc_user au left join acc_unit an on au.unit_id = an.unit_id;
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------------------+------+----------+-------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref                      | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------------------+------+----------+-------+
|  1 | SIMPLE      | au    | NULL       | ALL    | NULL          | NULL    | NULL    | NULL                     |   28 |   100.00 | NULL  |
|  1 | SIMPLE      | an    | NULL       | eq_ref | PRIMARY       | PRIMARY | 8       | smartpatroldb.au.unit_id |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------------------+------+----------+-------+
ref 非唯一性索引扫描,返回匹配某个单独值的所有行
explain select au.user_name, an.unit_name  from acc_unit an left join acc_user au on an.unit_id = au.unit_id;
+----+-------------+-------+------------+-------+------------------------+------------------------+---------+--------------------------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys          | key                    | key_len | ref                      | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+------------------------+------------------------+---------+--------------------------+------+----------+-------------+
|  1 | SIMPLE      | an    | NULL       | index | NULL                   | idx_unit_name          | 767     | NULL                     |    6 |   100.00 | Using index |
|  1 | SIMPLE      | au    | NULL       | ref   | FK_Reference_unit_user | FK_Reference_unit_user | 9       | smartpatroldb.an.unit_id |    7 |   100.00 | NULL        |
+----+-------------+-------+------------+-------+------------------------+------------------------+---------+--------------------------+------+----------+-------------+
range 索引给定范围行,使用一个索引选择行
explain select * from acc_user where user_id between 1000 and 3000;
+----+-------------+----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | acc_user | NULL       | range | PRIMARY       | PRIMARY | 8       | NULL |    2 |   100.00 | Using where |
+----+-------------+----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
index Full Index Scan,index与all区别,index只扫描索引树。通常比all快。
all 全表扫描
五、possible_keys: 显示可能应用到这张表的索引,一个或多个;但不一定查询实际使用到;
六、key:使用到索引;
explain select * from p_base_data where patrol_task_id = 1;
+----+-------------+-------------+------------+-------+------------------------------+---------------------------------+---------+------+------+----------+-------------+
| id | select_type | table       | partitions | type  | possible_keys                |                         key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------------+------------+-------+------------------------------+---------------------------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | p_base_data | NULL       | ref   | idx_p_base_data_patrolTaskId | idx_p_base_data_patrolTaskId    | 9       | const|    2 |   100.00 | Using where |
+----+-------------+-------------+------------+-------+------------------------------+---------------------------------+---------+------+------+----------+-------------+	
七、key_len:索引中使用的字节个数,可以通过该列计算查询中索引使用的长度;
explain select * from t1 where col1='ab';
+----+-------------+----------+------------+-------+---------------+---------------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key           | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+---------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | t1       | NULL       | ref   | idx_col1_col2 | idx_col1_col2 | 13      | NULL |  143 |   100.00 | Using where |
+----+-------------+----------+------------+-------+---------------+---------------+---------+------+------+----------+-------------+
explain select * from t1 where col1='ab' and col2='ac';
+----+-------------+----------+------------+-------+---------------+---------------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key           | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+---------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | t1       | NULL       | ref   | idx_col1_col2 | idx_col1_col2 | 26      | NULL |   1  |   100.00 | Using where |
+----+-------------+----------+------------+-------+---------------+---------------+---------+------+------+----------+-------------+
八、ref:显示索引列哪一列被使用了,如果可能的话,是一个常量;
九、rows: 根据表统计信息及索引使用情况。大致估算出找出所需读取行数; 越小越好
十、Extra:
using filesort
using temporary
using index
using where
using join buffer

 

MySQL EXPLAIN命令格式详解与性能优化实践 EXPLAIN是MySQL数据库性能调优的核心工具,通过分析SQL执行计划帮助开发者优化查询性能。其原理是展示查询优化器选择的执行路径,包括表扫描方式、索引使用情况和连接算法等关键技术细节。在工程实践中,不同版本的MySQL提供了TRADITIONAL、JSON和TREE三种输出格式,分别适用于快速诊断、深度分析和可视化展示等场景。特别是MySQL 8.0引入的TREE格式和ANALYZE模式,为复杂查询优化提供了更直观的调试手段。合理运用这些工具可以显著提升SQL执行效率,解决索引失效、全表扫描等常见性能 阅读详情

相关推荐

实战解析:利用Python requests库高效抓取京东商品评论并构建结构化数据集

本文详细介绍了如何利用Python requests库高效抓取京东商品评论并构建结构化数据集。通过分析京东评论接口、处理反爬机制以及数据解析存储,帮助开发者快速获取电商数据,适用于竞品监控、用户画像构建等商业场景。

weixin_42526415的博客 837

MySQL性能优化神器Explain

本文涉及:MySQL性能优化神器Explain的使用 简介 虽然使用Explain不能够马上调优我们的SQL,它也不能给予我们一些调整建议,但是它能够让我们了解MySQL 优化器是如何执行SQL 语句的 通过Explain,我们可以分析出以下结果: 表的读取顺序 数据读取操作的操作类型 哪些索引可以使用 哪些索引被实际使用 表之间的引用 每张表有多少行被优化器查询 Expla...

Java学习录 727

eICU数据库没有ventilation_event表

各位学友大家好,我是环湖医院神经外科的飞时过,很多外院的老师和我问,ventilation_event表的问题,哪怕用ChatGPT也无法正确生成,今天我给大家用SQL做一个拿来就能用的。

环湖数据科学知识共享平台 936

Mysql EXPLAIN详解:从底层原理到性能优化实战

本文深入解析MySQL执行计划(EXPLAIN)的使用与优化策略。首先介绍了EXPLAIN的作用与重要性,它能帮助开发者"窥探"数据库优化器的内部决策过程,是SQL性能优化的关键工具。然后详细讲解了执行计划的输出格式和各字段含义,包括id、select_type、table、type、key、rows等核心指标,以及JSON格式和EXTENDED扩展功能的使用方法。最后重点阐述了性能优化策略,包括避免全表扫描、消除文件排序和临时表、构建覆盖索引等实用技巧。通过系统学习本文,开发者可以掌握

持续输出Java相关知识 1936

Cesium中实现阴影率分析

看到群里有人在研究这个,所以看了一下。主要是模仿超图的,实现原理超图有做回答:但其实超图的这个实现方式还是过于复杂,原因是:既然是获取太阳的日照阴影,而Cesium中原本就存在太阳,且能投射阴影,因此其实并不需要再次计算太阳位置并计算视锥获取深度图,直接使用Cesium原生的太阳深度图即可。

weixin_43481439的博客 2215

国标GB28181视频平台EasyGBS国标平台设备播放断流现象的问题解决方案

于是排查代码发现,当设备网络较差时,设备会断流,超过指定的时间30s(EasyGBS平台默认值),就会主动清除流媒体服务,但是redis中的流数据还在,而当设备在录像时,自动保活会从redis中取保活流数据,所以就会出现设备状态显示正在播放,但是流已经消失的情况。有用户反馈,在安防视频监控EasyGBS运行时,接入的设备刚开始可以正常播放,开启云端录像后,也没有停止和重播的操作,但是出现了视频流断流的现象。在设备进行播放保活时,对流信息进行判断,添加一个最后的处理流时间,如果超过指定时间就自动重新拉流。

EasyNTS的博客 434

mysql性能优化-查询执行计划分析(EXPLAIN)

EXPLAIN命令用于显示 MySQL 如何执行SELECT查询。它提供了关于表如何被扫描、使用了哪些索引、表之间的连接顺序、连接类型等关键信息。通过EXPLAIN命令,开发者可以深入了解查询的执行方式,从而找出可以优化的地方。基本语法MySQL 将会返回查询执行的详细计划。可以用于SELECT查询,以及包含SELECT的INSERTUPDATEDELETE语句。EXPLAIN是 MySQL 查询优化中非常重要的工具,通过它我们可以深入了解查询执行的过程,找到性能瓶颈,并通过索引、查询重构等手段进行优化。

Flying_Fish_roe的博客 2036

RPMsg:协议简介

两台计算机可以通过TCP/IP进行通信,那么同一颗芯片上的两个核心怎么通信呢?

SunnyZhou-1024的博客 1万+

MySQL性能优化explain关键字详解

当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。因为一旦范围条件被处理,索引的扫描只能停止在范围条件的位置,因此后面的列(如 position)的条件必须通过其他方式处理,可能会导致索引的部分失效或者需要回表扫描。如果对索引列进行函数计算,例如截取,转换,也就是索引字段发生了改变,则在B+树的数据结构中就无法匹配,导致索引失效。即上面的sql语句,依照优先级,最先执行的一定是from后面的子句,因为前面的查询条件都是依赖此。

西岭千秋雪的博客 1240

但是我如果真的用差速轮去控制转向 为了尽量原地旋转 转向角度精确 我应该怎么去配置左右两个轮子的速度呢

目标实现方式原地转向左右轮速度相等、方向相反精确角度用 IMU 检测 yaw 实时对齐停止判断达到目标 yaw ± 容差时立即停转控制方式状态机(idle → turning → done)推荐容差2°~3° (可根据实际调整)

qqqweiweiqq的博客 312

收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下1、收放卷+排线控制收放卷+排线控制系统框图-优快云博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代码)-优快云博客文章浏览阅读16次。1、收放卷前馈量计算FC(博途PLC):收放卷前馈量计算FC(梯形图+SCL代码)-优快云博客文章浏览阅读534次。2、收放卷前馈量计算FC。

RXXW_Dor的博客 3119

Mysql性能优化神器Explain的使用

Mysql性能优化神器Explain的使用 mysql> explain select * from user_info where id = 2\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: user_info partitions: NULL type: const possibl

qq_39177602的博客 240

YOLOv11改进 | 特殊场景检测篇 | 利用图像去雾网络UnfogNet改进yolov11图像雾天检测能力(全网独家首发改进)

本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv11针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv11的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可以忽略不计这是非常难得的,因为其也算是一种图像增强算法,同时本文的内容不影响其它的模块改进可以作为工作量凑近大家的论文里,非常的适用,图像去雾检测为群友最近提出的需要的改进。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 1628

MySQL性能优化:从理解explain执行计划开始

在数据库优化领域,EXPLAIN 是 MySQL 提供的最强大的诊断工具之一。通过这个简单的关键字,我们可以透视 SQL 语句的执行计划,就像给数据库引擎安装了一个 X 光机,能够清晰看到查询是如何被处理的、索引是否有效、是否存在性能瓶颈等重要信息。确认 departments.name 索引的使用情况。简单查询(不包含子查询或UNION):全索引扫描(扫描索引上的全部数据)FROM子句中的子查询(派生表):全表扫描(需要重点优化的信号):关联查询时使用主键/唯一索引。子查询中的第一个SELECT。

nihao2q的博客 832

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

mysql 性能优化之Explain讲解

是 MySQL 中用于分析查询执行计划的重要工具,通过它可以查看查询如何使用索引、扫描数据的方式以及表连接顺序等信息,从而找出性能瓶颈。深入分析查询执行计划,针对性地优化索引和查询语句,可以显著提升 MySQL 性能。:全表扫描后进行文件排序(MySQL 8.0+ 支持。(扫描行数进一步减少),(扫描行数大幅减少),(索引扫描),消除了。

qq_37782946的博客 993

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

mysql explain 阿里云_Mysql 性能优化Explain详解

Mysql 性能优化Explain详解explain功能我们在日常使用中,使用慢查询找到执行时间比较久的查询,然后使用SHOW STATUS、SHOW PROFILE、和explain做单条语句的分析。使用explain关键字可以模拟优化器执行sql查询语句,从而知道Mysql是如何处理你的sql语句的。分析你的查询语句或者表结构的性能瓶颈。具体可以分析哪些表的读取顺序数据读取操作的操作类型哪些索...

weixin_34743057的博客 149

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

mysql性能优化工具explain介绍

Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 Explain分析示例 参考官方文档:MySQL :: MySQL 5.7 Reference Manual :: 8.8.2 EXPLAIN Output Forma

robinhunan的博客 1832

简单了解SQL性能优化工具MySql Explain

点击上方蓝色字体,选择“设为星标”优质文章,及时送达写在前面MySql Explain是对SQL进行性能优化不可或缺的工具,通过他我们可以对SQL进行一定的分析和性能优化,降低线上业务因...

春哥大魔王的博客 191

mysql explain 优化_MySQL 性能优化神器 Explain 使用分析

更新于 2017-01-18约 28 分钟简介MySQL 提供了一个 EXPLAIN 命令, 它可以对SELECT语句进行分析, 并输出SELECT执行的详细信息, 以供开发人员针对性优化.EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 Explain 就可以了, 例如:EXPLAINSELECT*fromuser_infoWHEREid准备为了接下来方便...

weixin_39693971的博客 89

MySQL性能优化 —— Explain

程序员对性能优化都不陌生,今天来复习一下 Explain,顺便写个随手笔记,方便后续参考。

搬运Gong 512

mysql配置优化神器_MySQL性能优化神器Explain

本文涉及:MySQL性能优化神器Explain的使用简介虽然使用Explain不能够马上调优我们的SQL,它也不能给予我们一些调整建议,但是它能够让我们了解MySQL 优化器是如何执行SQL 语句的通过Explain,我们可以分析出以下结果:表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引用每张表有多少行被优化器查询Explain命令的用法十分简单, 在 select...

weixin_42402188的博客 207

MySQL 性能优化神器 Explain 使用分析

MySQL 性能优化神器 Explain 使用分析 MySQL执行计划使用分析 SQL优化案例 mysql 查看优化器重写后的sql sql优化器会重写sql,sql在执行时,并不一定就会按照我们写的顺序执行,mysql优化器会重写sql,如何才能看到sql优化器重写后的sql呢?这就要用到explain extended和show warnings了。 explain extende...

121

mysql优化器resolver_MySQL 性能优化神器 Explain 使用分析

更新于 2017-01-18约 28 分钟简介MySQL 提供了一个 EXPLAIN 命令, 它可以对SELECT语句进行分析, 并输出SELECT执行的详细信息, 以供开发人员针对性优化.EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 Explain 就可以了, 例如:EXPLAINSELECT*fromuser_infoWHEREid准备为了接下来方便...

weixin_29011239的博客 192

explain mysql 耗时,Mysql 性能优化Explain详解

explain功能我们在日常使用中,使用慢查询找到执行时间比较久的查询,然后使用SHOW STATUS、SHOW PROFILE、和explain做单条语句的分析。使用explain关键字可以模拟优化器执行sql查询语句,从而知道Mysql是如何处理你的sql语句的。分析你的查询语句或者表结构的性能瓶颈。具体可以分析哪些表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引...

weixin_32115711的博客 631

MySQL性能优化神器—explain

MySQL性能优化神器—explain 一、explain是什么? 简单来讲就是官方给的一个优化工具,直接在你的SQL语句前加上explain,执行整条语句,之后你就可以根据执行结果优化你的SQL啦,废话不多说,直接刚实例 测试实例 1、创建测试表 CREATE TABLE `sql_explain_student` ( ...

风过留声 378
上一篇: msql性能优化-慢sql
下一篇: ThreadPool笔记
pin伴夏
博客等级 码龄9年 3粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值