MySQL高级 之 explain执行计划详解

news2025/1/10 23:46:34

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。

explain执行计划包含的信息

这里写图片描述

其中最重要的字段为:id、type、key、rows、Extra

各字段详解

id

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
三种情况:
1、id相同:执行顺序由上至下
这里写图片描述

2、id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
这里写图片描述

3、id相同又不同(两种情况同时存在):id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
这里写图片描述

select_type

查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询

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
这里写图片描述

type

访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,好的sql查询至少达到range级别,最好能达到ref

1、system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,可以忽略不计

2、const:表示通过索引一次就找到了,const用于比较primary key 或者 unique索引。因为只需匹配一行数据,所有很快。如果将主键置于where列表中,mysql就能将该查询转换为一个const
这里写图片描述

3、eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。
这里写图片描述
注意:ALL全表扫描的表记录最少的表如t1表

4、ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质是也是一种索引访问,它返回所有匹配某个单独值的行,然而他可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体
这里写图片描述

5、range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了那个索引。一般就是在where语句中出现了bettween、<、>、in等的查询。这种索引列上的范围扫描比全索引扫描要好。只需要开始于某个点,结束于另一个点,不用扫描全部索引
这里写图片描述

6、index:Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常为ALL块,应为索引文件通常比数据文件小。(Index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取)
这里写图片描述

7、ALL:Full Table Scan,遍历全表以找到匹配的行
这里写图片描述

possible_keys

查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用

key

实际使用的索引,如果为NULL,则没有使用索引。
查询中如果使用了覆盖索引,则该索引仅出现在key列表中
这里写图片描述
这里写图片描述

key_len

表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len是根据表定义计算而得的,不是通过表内检索出的

ref

显示索引的那一列被使用了,如果可能,是一个常量const。

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

Extra

不适合在其他字段中显示,但是十分重要的额外信息

1、Using filesort
mysql对数据使用一个外部的索引排序,而不是按照表内的索引进行排序读取。也就是说mysql无法利用索引完成的排序操作成为“文件排序”
这里写图片描述
由于索引是先按email排序、再按address排序,所以查询时如果直接按address排序,索引就不能满足要求了,mysql内部必须再实现一次“文件排序”

2、Using temporary
使用临时表保存中间结果,也就是说mysql在对查询结果排序时使用了临时表,常见于order by 和 group by
这里写图片描述

3、Using index
表示相应的select操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高
如果同时出现Using where,表明索引被用来执行索引键值的查找(参考上图)
如果没用同时出现Using where,表明索引用来读取数据而非执行查找动作
这里写图片描述
覆盖索引(Covering Index):也叫索引覆盖。就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖
注意:
a、如需使用覆盖索引,select列表中的字段只取出需要的列,不要使用select *
b、如果将所有字段都建索引会导致索引文件过大,反而降低crud性能

4、Using where :
使用了where过滤

5、Using join buffer :
使用了链接缓存

6、Impossible WHERE:
where子句的值总是false,不能用来获取任何元祖
这里写图片描述

7、select tables optimized away:
在没有group by子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段在进行计算,查询执行计划生成的阶段即可完成优化

8、distinct:
优化distinct操作,在找到第一个匹配的元祖后即停止找同样值得动作

综合Case

这里写图片描述

执行顺序
1(id = 4)、【select id, name from t2】:select_type 为union,说明id=4的select是union里面的第二个select。

2(id = 3)、【select id, name from t1 where address = ‘11’】:因为是在from语句中包含的子查询所以被标记为DERIVED(衍生),where address = ‘11’ 通过复合索引idx_name_email_address就能检索到,所以type为index。

3(id = 2)、【select id from t3】:因为是在select中包含的子查询所以被标记为SUBQUERY。

4(id = 1)、【select d1.name, … d2 from … d1】:select_type为PRIMARY表示该查询为最外层查询,table列被标记为 “derived3”表示查询结果来自于一个衍生表(id = 3 的select结果)。

5(id = NULL)、【 … union … 】:代表从union的临时表中读取行的阶段,table列的 “union 1, 4”表示用id=1 和 id=4 的select结果进行union操作。

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

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

相关文章

前端安全和防护:如何保护网站和用户信息的安全

第一章&#xff1a;引言 在当今数字化时代&#xff0c;随着互联网的飞速发展&#xff0c;网站已成为人们获取信息和进行交流的主要渠道。然而&#xff0c;随之而来的是对网站安全的日益关注。作为前端开发者和网站管理员&#xff0c;我们有责任确保用户的信息和网站的安全。本…

可分析表情和情绪的轻量化眼镜:Emteq OCOsense解析

近年来&#xff0c;越来越多VR头显开始尝试结合眼球追踪、手势追踪等生物识别技术&#xff0c;甚至在一些VR社交场景&#xff0c;也在探索将Avatar与面部识别功能结合。可以想象&#xff0c;未来生物识别与AR/VR等穿戴技术的关系将越来越紧密&#xff0c;尽管现阶段相关硬件在体…

Jenkins安装插件教程 牢记 Jenkis安装插件(plugin)的两种方法

目录 jenkins在线安装组件&#xff08;plugin&#xff09; jenkins离线安装组件&#xff08;plugin&#xff09; 前言&#xff1a;在jenkins学习使用或使用的过程中&#xff0c;由于网络的问题&#xff0c;在选择安装插件的时候&#xff0c;会出现某些插件安装失败。这是需要…

Word控件Spire.Doc 【列表】教程:在 Word 文档中插入列表

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【MaxCompute】基于Package跨项目访问资源实践

背景 目前随着公司业务的不断扩展&#xff0c;各个业务线的数据也越来越多&#xff0c;如果所有数据都集中管理比较错综复杂。MaxCompute的跨项目访问资源比较适合这样的场景。每个业务线创建对应的project&#xff0c;自行管理数据。如果有需要访问其他业务线数据的诉求&…

python3 爬虫相关学习6:html 和 css 简要回顾

因为要学爬虫&#xff0c;需要了解下html内容&#xff0c;我之前大概看过&#xff0c;这算是回顾下 以下html简单回顾内容&#xff0c;跟着这个地址的教程看了一遍&#xff0c;感谢 https://www.w3school.com.cn/html/html_jianjie.asp 下面是笔记 目录 1 html 2 常用标签…

文件缓冲区概念和磁盘的存储原理以及软硬链接

目录 缓冲区 缓冲区执行概念 C语言缓冲区存在于FILE结构体中 用户缓冲区刷新到OS缓冲区的策略 发生重定向 redir未重定向。 redir重定向。 磁盘的存储原理 细讲: Inode table Date block Inode bitmap Block bitmap Group Descriptor Table super Block 在目录…

脑机接口科普0020——是否鸡娃

本文禁止转载!!!! 现在有很多人开始给小孩早教&#xff0c;鸡娃&#xff0c;幼儿园就开始学英语&#xff0c;小学就开始学初中的内容&#xff0c;初中就开始学高中的内容。高中后开始拼命的做卷子&#xff0c;准备考大学&#xff0c;考完大学放纵。大学毕业后失业。 关于是否…

Matlab进阶绘图第21期—三角方块热图

三角方块热图&#xff0c;顾名思义&#xff0c;就是仅保留方块热图数据矩阵的上三角或下三角部分。 三角方块热图简单明了&#xff0c;通过不同颜色、不同大小的圆形表示数据的大小&#xff0c;可以更加直观地对矩阵数据进行可视化表达。 本文使用自制的trisquareheatmap小工…

ERROR: slow sql .. millis.

问题现象 运行过程中&#xff0c;查询页面报错&#xff0c;如下图&#xff1a; 404 NOT FOUND 排查日志&#xff0c;如下图&#xff1a; 查看数据库&#xff1a; 解决办法 在关联字段上添加索引&#xff0c;查询正常。

Linkage Mapper之Pinchpoint Mapper功能解析(含实际案例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 白尾兔(Lepus townsendii)的Pinchpoint映射器输出和栖息地浓集区效果图: 图片来源地址 <

【CANN训练营0基础赢满分秘籍】应用开发深入讲解→DVPP

1 数据预处理概述 1.1 典型使用场景 受网络结构和训练方式等因素的影响&#xff0c;绝大多数神经网络模型对输入数据都有格式上的限制。在计算视觉领域&#xff0c;这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不—致时…

生命游戏的简单实现(c++代码)

今天上数模课&#xff0c;本来一如既往准备自习&#xff0c;但是&#xff0c;生命游戏——从前就在“人工智能”的书上看到过&#xff0c;今天一讲&#xff0c;发现如此简单。课上30min实现了一份简单的生命游戏代码/ 目录 前言 一、生命游戏 生命游戏的基本设置 生命游戏的规则…

WIN提权

win提权分为web和本地提权 web提权就是getshell后&#xff0c;权限是网站权限&#xff0c;要进行提权 本地提权是本地用户进行提权 本地用户的权限大于网站权限&#xff0c;所以本地提权成功概率比web提权概率大 因为我们做渗透测试&#xff0c;一般都是从网站入侵。所以大…

提高电商团队效率:必备的协作工具盘点

随着电商行业的快速发展&#xff0c;电商团队的规模和任务不断增加。然而&#xff0c;文件管理和文件协作方面的问题也随之出现。 电商行业可能存在的问题&#xff1a; 文件传输效率低下&#xff1a;电商团队需要频繁地共享和传输大量的文件&#xff0c;这会导致文件传输效率低…

快速上手,使用关键字驱动测试框架作为Web应用程序的自动化测试武器

目录 前言&#xff1a; 一、预备知识 二、关键字驱动测试框架 三、关键字驱动测试脚本 四、总结 前言&#xff1a; 自动化测试是软件测试中的重要环节之一&#xff0c;它可以帮助开发人员提高测试效率&#xff0c;节省时间和人力成本。随着互联网的发展&#xff0c;Web应…

互联网医院牌照申请|互联网医院申请流程

互联网医院牌照申请需要哪些资料和条件 随着互联网医疗的发展&#xff0c;越来越多的医疗机构开始申请互联网医院牌照。那么&#xff0c;互联网医院牌照的申请需要哪些资料和条件呢&#xff1f;以下是相关介绍。 申请资料 一、法定代表人身份证、执业医师资格证明 二、机构…

分布式事务解决方案Stata 整合 Spring Cloud + Nacos

1. 简介 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 2. Docker 安装 Seata 2.1 下载镜像 docker pull seataio/se…

js 如何定义类和引用

前言 JS是弱定义语言&#xff0c;最适合用于前端的数据处理。因为前端是数据的终点&#xff0c;用完就抛弃&#xff0c;所以前端一般都只是处理简单的业务逻辑。 但是有时候我们希望前端能进行一些复杂的处理&#xff0c;比如SqlLite本地缓存数据库&#xff0c;或者前端处理一…

低代码开发平台:打破IT与业务壁垒,实现高效协作

我们生活在一个离不开应用程序的世界&#xff1a;无论是个人消费者&#xff0c;还是企业运营&#xff0c;应用程序往往是最终的解决方案&#xff0c;它们可以是模块化的&#xff0c;也可以是一个整体&#xff0c;将数据、信息都链接起来&#xff0c;以提高生产生活的效率。 从企…