MySQL——EXPLAIN用法详解

news2024/9/22 9:27:38

EXPLAIN是MySQL官方提供的sql分析的工具之一,可以用于模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。EXPLAIN主要用于分析查询语句或表结构的性能瓶颈。

以下是基于MySQL5.7.19版本进行分析的,不同版本之间略有差异。

1、EXPLAIN使用

explain+sql语句,通过执行explain可以获得sql语句执行的相关信息。

2、EXPLAIN包含的信息

MySQL EXPLAIN包含字段
列名说明
id执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置
select_type显示本行是简单或复杂select。如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUlT)
table访问引用哪个表(引用某个查询,如“user”)
partitions匹配的分区
type数据访问/读取操作类型(ALL、index、range、ref、eq_ref、const/system、NULL)
possible_keys揭示哪一些索引可能有利于高效的查找
key显示mysql决定采用哪个索引来优化查询
key_len显示mysql在索引里使用的字节数
ref显示了之前的表在key列记录的索引中查找值所用的列或常量
rows为了找到所需的行而需要读取的行数,估算值,不精确。通过把所有rows列值相乘,可粗略估算整个查询会检查的行数
filtered表示此查询条件所过滤的数据的百分比
extra额外信息,如using index、filesort等

2.1 id

id是用来顺序标识整个查询中SELELCT语句的,在嵌套查询中id越大的语句越先执行。该值可能为NULL,如果这一行用来说明的是其他行的联合结果。大致分为下面几种情况:

(1)id相同,执行顺序由上至下

EXPLAIN select * from user,school,class where user.school_id = school.school_id and user.class_id = class.class_id

三个id都为1,表示具有相同的优先级,执行顺序由上而下,具体执行顺序由优化器决定,这里执行顺序为school,user,class。

(2)id不同,数字越大优先级越高

EXPLAIN select * from user where school_id = (select school_id from school where school_id = (select school_id from class where class_id = 2))

如果sql中存在子查询,那么id的序号会递增,id越大越先被执行。如上述查询,执行顺序是class、school、user,也就是说,最里面的子查询最先执行,由里往外执行。

如果上述查询中的“=”换成“in”,则运行结果会发生变化,原因是每执行一次最外层子查询,里面的子查询都会被重复执行,这也就是sql优化中提到的尽量不要使用in关键字

 使用in关键字示例:

EXPLAIN select * from user where school_id in (select school_id from school where school_id in (select school_id from class where class_id = 2))

2.2 select_type 

 select_type表示查询的类型

类型说明
simple简单子查询,不包含子查询和union
primary包含union或者子查询,最外层的部分标记为primary
subquery一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询
derived派生表——该临时表是从子查询派生出来的,位于form中的子查询
union位于union中第二个及其以后的子查询被标记为union,第一个就被标记为primary如果是union位于from中则标记为derived
union result用来从匿名临时表里检索结果的select被标记为union result
EXPLAIN select * from user where school_id = (select school_id from school where school_id = (select school_id from class where class_id = 2))

2.3 table

table显示查询操作基于哪张表的。

EXPLAIN select user.* from user where school_id = (select school_id from school where school_id = 2)
union 
select user.* from user where class_id = (select class_id from class where class_id = 2)

table列并不一定是真实存在的表,比如上面出现<union1,3>,一般来说会出现下面的取值:

  • <union a,b>:输出结果中编号为 a 的行与编号为 b 的行的结果集的并集。
  • < derived a>:输出结果中编号为 a 的行的结果集,derived 表示这是一个派生结果集,如 FROM 子句中的查询。
  • < subquery a>:输出结果中编号为 a 的行的结果集,subquery 表示这是一个物化子查询。

2.4 partitions

partitions列是查询时匹配到的分区信息,对于非分区表值为NULL,当查询的是分区表时,partitions显示分区表命中的分区情况。

2.5 type

type显示的是访问类型,是较为重要的一个指标,性能从最好到最坏依次是 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。一般来说,得保证查询至少达到range级别,最好能达到ref。

类型说明
system这是const连接类型的一种特例,表仅有一行满足条件。
const当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。当主键放入where子句时,mysql把这个查询转为一个常量(高效)
eq_ref最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效)
ref一种索引访问,它返回所有匹配某个单个值的行。此类索引访问只有当使用非唯一性索引或唯一性索引非唯一性前缀时才会发生。这个类型跟eq_ref不同的是,它用在关联操作只使用了索引的最左前缀,或者索引不是UNIQUE和PRIMARY KEY。ref可以用于使用=或<=>操作符的带索引的列。
fulltext查询时使用 fulltext 索引。
ref_or_null对于某个字段既需要关联条件,也需要null 值的情况下。查询优化器会选择用ref_or_null 连接查询。
index_merge在查询过程中需要多个索引组合使用,通常出现在有or 关键字的sql 中。
unique_subquery该联接类型类似于index_subquery。子查询中的唯一索引。在某些in子查询里,用于替换eq_ref
index_subquery利用索引来关联子查询,不再全表扫描。用于非唯一索引,子查询可以返回重复值。类似于unique_subquery,但用于非唯一索引
range范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range
index和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多
all全表扫描,性能最差。

2.6 possible_keys

查询时可能使用的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出。注意是可能,实际查询时不一定会用到。

2.7 key

查询时实际使用的索引,没有使用索引则为NULL。查询时若使用了覆盖索引,则该索引只出现在key字段中。

2.8 key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好

key_len显示的值是索引字段可能的最大长度,并非实际使用长度,即key_len是根据表定义计算得到,不是通过表内检索。

key_len 字段能够帮你检查是否充分的利用上了索引。ken_len 越长,说明索引使用的越充分。

注意:key_len只计算where条件中用到的索引长度,而排序和分组即便是用到了索引,也不会计算到key_len中。

2.9 ref

显示索引的哪一列被使用了,常见的取值有:const, func,null,字段名。

  • 当使用常量等值查询,显示const
  • 当关联查询时,会显示相应关联表的关联字段
  • 如果查询条件使用了表达式函数,或者条件列发生内部隐式转换,可能显示为func
  • 其他情况null

2.10 rows

rows 列表示 MySQL 认为它执行查询时可能需要读取的行数,一般情况下这个值越小越好!

2.11 filtered

filtered 是一个百分比的值,表示符合条件的记录数的百分比。简单点说,这个字段表示存储引擎返回的数据在经过过滤后,剩下满足条件的记录数量的比例。

MySQL.5.7版本以前想要显示filtered需要使用explain extended命令。MySQL.5.7后,默认explain直接显示partitionsfiltered的信息。

2.12 Extra

Extra是EXPLAIN输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。

类型说明
Using filesortMySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,但注意虽然叫filesort但并不是说明就是用了文件来进行排序,只要可能排序都是在内存里完成的。大部分情况下利用索引排序更快,所以一般这时也要考虑优化查询了。使用文件完成排序操作,这是可能是ordery by,group by语句的结果,这可能是一个CPU密集型的过程,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。
Using temporary用临时表保存中间结果,常用于GROUP BY 和 ORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。
Not existsMYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了。
Using index说明查询是覆盖了索引的,不需要读取数据文件,从索引树(索引文件)中即可获得信息。如果同时出现using where,表明索引被用来执行索引键值的查找,没有using where,表明索引用来读取数据而非执行查找动作。这是MySQL服务层完成的,但无需再回表查询记录。
Using index condition这是MySQL 5.6出来的新特性,叫做“索引条件推送”。简单说一点就是MySQL原来在索引上是不能执行如like这样的操作的,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上。
Using where使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。注意:Extra列出现Using where表示MySQL服务器将存储引擎返回服务层以后再应用WHERE条件过滤。
Using join buffer使用了连接缓存:Block Nested Loop,连接算法是块嵌套循环连接;Batched Key Access,连接算法是批量索引连接
impossible wherewhere子句的值总是false,不能用来获取任何元组
select tables optimized away在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作,或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
distinct优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

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

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

相关文章

SHELL脚本编程基础,bilibili王晓春老师课程个人笔记(写比较简单,仅供参考)

文章目录 一、第一天&#xff08;Shell脚本编程基础&#xff09;作者视频ppt部分作者视频操作编写一个hello.sh可执行文件使hello.sh可以到处运行没有执行权限的执行方式下载httpd&#xff08;web服务器&#xff09;curl字符界面浏览器 命令列表凌乱笔记 作业重点&#xff1a; …

【每日三十六记 —— BGP知识点汇总大全】(第一弹)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️ 零基…

群晖NAS:套件源地址添加提示 无效位置 系统证书重置

群晖NAS&#xff1a;套件源地址添加提示 无效位置 网上很多案例和解决方案&#xff0c;没生效。通过重置延长系统证书即可 设置 - 安全性 - 证书 - 群晖证书 - 右击菜单 延长证书 延长成功后&#xff0c;在套件中心添加即可。 若不生效&#xff0c;可查看网上别人的方案&…

嵌入式1.1 单片机基础总结

单片机基础总结 https://blog.csdn.net/weixin_40414160/article/details/124526924?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-124526924-blog-123451395.235^v38^pc_relevant_default_base3&spm1001.2101.3001.4…

无缝集结:一键式部署前后端分离项目,快速构建强大的容器化应用

一键式部署前后端分离项目&#xff0c;快速构建强大的容器化应用 文章目录 一键式部署前后端分离项目&#xff0c;快速构建强大的容器化应用关于作者1.搜索nginx镜像2.拉取nginx镜像3.运行镜像4.在/home/ 目录下新建目录 nginx5.拷贝nginx配置文件到主机目录&#xff0c;为文件…

CPSC法规-2023/9月召回案例 多款产品被召回

国内双十一大促的预热已然开始&#xff0c;国外感恩节、万圣节、黑五等产品大促也随即临近&#xff0c;卖家在大量备货的同时&#xff0c;务必保障自身产品通过相关安全测试&#xff0c;一旦产品被相关部门抽查没能达标&#xff0c;或因质量问题被消费者投诉&#xff0c;将可能…

13.4 DirectX内部劫持绘制

相对于外部绘图技术的不稳定性&#xff0c;内部绘制则显得更加流程与稳定&#xff0c;在Dx9环境中&#xff0c;函数EndScene是在绘制3D场景后&#xff0c;用于完成将最终的图像渲染到屏幕的一系列操作的函数。它会将缓冲区中的图像清空&#xff0c;设置视口和其他渲染状态&…

Win10系统备份的方法和步骤

在Win10电脑中&#xff0c;用户为了避免丢失重要的数据而无法找回&#xff0c;提前备份这些重要数据是特别有必要的。但是&#xff0c;许多新手用户不知道Win10系统备份的详细操作方法&#xff0c;接下来小编给大家介绍关于备份Win10系统的简单方法与步骤。 Win10系统备份的方法…

d3中svg标签里插入图片不显示的解决方案

1. 使用背景 在d3中的svg元素中插入图片&#xff0c;图片未正常显示。 2. 使用image标签 首先&#xff0c;在svg中加载图片用的image标签&#xff0c;而不是img标签。支持的图片格式可以是 JPEG、PNG、SVG.。 该元素<img> 一样&#xff0c;会解析渲染为图片。 <im…

vue2进阶学习知识汇总

目录 1.组件之处理边界情况 1.1 子组件访问根组件数据 1.2 子组件访问父组件数据 1.3 父组件访问子组件 1.4 依赖注入 1.5 程序化的事件侦听器 1.6 递归组件 1.7 内联模板 1.8 X-Template 1.9 强制更新 1.10 v-once 2.过渡效果与状态 2.1 过渡效果 2.1.1 单元素/…

VMware Workstation Pro下载安装

VMware Workstation Pro下载安装 下载 VMware Workstation Pro 1. 进入官网下载页面 VMware Workstation Pro下载页面&#xff1a;https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html 2. 选择对应操作系统平台下载 VMware Workstation Pr…

2023年清洁电器行业数据分析:洗地机市场规模持续倍增,进入赛点

洗地机作为清洁电器领域的明星品类&#xff0c;正在成为继扫地机器人之后拉动清洁电器市场大盘的又一核心动力。 在清洁电器领域&#xff0c;扫地机器人、洗地机和吸尘器是三大热门品类。截至今年9月份&#xff0c;根据鲸参谋平台的数据显示&#xff0c;吸尘器的规模继续大幅下…

基于Android 10系统的瑞芯微RK3399K烧写镜像实录

基于Android 10系统的瑞芯微RK3399K烧写镜像实录 1. 前言2. 官网及相关资料3. 烧写固件所需软件4. 直接烧写单一固件步骤5. 固件文件6. Windows下烧写准备6.1 安装 RK USB 驱动6.2 连接设备 7. 烧写固件7.1 烧写统一固件 update.img7.2 烧写分区映像 8. Linux下烧写8.1 upgrade…

Vue组件自定义事件父子

Vue组件父子之间自定义事件 父组件使用props传递数据给子组件&#xff0c;子组件怎么跟父组件通信呢&#xff1f;这时&#xff0c;Vue的自定义事件就派上用场了 示例代码 <div id"zjw1"><span>CQNU--重庆ZJW--同学</span><input placeholder…

数据安全小课堂开讲啦!看这里!

数据安全小课堂开讲啦&#xff01;看这里&#xff01; 1、什么是数据&#xff1f; 《数据安全法》第三条明确&#xff0c;本法所称的数据&#xff0c;就是指任何以电子或者其他方式对信息的记录。小到个人使用手机、电脑等电子产品时浏览的网页、下载的应用、存储的文件&…

【等保小课堂】等保测评后还要花很多钱做等保整改吗?

我国正在严格执行等保政策&#xff0c;过等保企业也越来越多。但大家对于等保政策还不是很了解&#xff0c;有小伙伴在问&#xff0c;等保测评后还要花很多钱做等保整改吗&#xff1f; 等保测评后还要花很多钱做等保整改吗&#xff1f; 【回答】&#xff1a;不一定。等保测评后…

Web前端接入Microsoft Azure AI文本翻译

Azure 文本翻译是 Azure AI 翻译服务的一项基于云的 REST API 功能。 文本翻译 API 支持实时快速准确地进行源到目标文本翻译。 文本翻译软件开发工具包 (SDK) 是一组库和工具&#xff0c;可用于轻松地将文本翻译 REST API 功能集成到应用程序中。 文本翻译 SDK 可跨 C#/.NET、…

一篇文章教会你搭建Hive分布式集群

目录 ​编辑 一、环境描述 二、安装mysql 2.1 卸载mysql 2.1.1 列出安装的mysql 2.1.2 卸载mysql 2.1.3 删除mysql文件目录 2.1.3.1 查看mysql 目录 2.1.3.2 依次删除 2.2.1 下载安装源 2.2.2 安装源rpm 2.2.3 加入rpm密钥 2.2.4 执行安装 2.2.5 设置开机自启动 …

STM32 定时器配置不当导致误差(精度)偏大的问题发现与解决

通用定时器TIM2/3/4/5&#xff0c;PWM输出1Khz的波形 一开始初始化代码如下&#xff1a; void MX_TIM2_Init(void)//1kHz {TIM_ClockConfigTypeDef sClockSourceConfig {0};TIM_MasterConfigTypeDef sMasterConfig {0};TIM_OC_InitTypeDef sConfigOC {0};htim2.Instance T…

Git简明教程

1.Git的定位 在我们自己开发项目的过程中&#xff0c;经常会遇到这样的情况&#xff0c;为了防止代码丢失&#xff0c;或者新变更的代码影响到原有的代码功能&#xff0c;为了在失误后能恢复到原来的版本&#xff0c;不得不复制出一个副本,比如&#xff1a;“坦克大战1.0”“坦…