MySQL EXPLAIN详解

MySQL EXPLAIN 详解 EXPLAIN 是 MySQL 提供的性能分析工具,用于查看 SQL 查询的执行计划(即优化器如何执行查询)。它通过模拟查询过程(不实际执行 SQL)返回一个表格,展示索引使用、表连接方式、扫描行数等关键信息,帮助开发者诊断性能瓶颈并优化查询。核心作用:基本语法: FORMAT:指定输出格式,默认是表格形式(TRADITIONAL),JSON 格式包含更详细信息。 示例: 输出结果示例:性能瓶颈难以定位索引优化盲目性资源浪费与扩展性问题维护成本高必用 EXPLAIN 的场景:快速优化步骤:通过 EXPL 阅读详情

MySQL EXPLAIN命令是查询性能优化不可缺少的一部分,该文主要讲解explain命令的使用及相关参数说明。

EXPLAIN Output Columns

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

id

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

select_type

表示查询的类型

类型说明
simple简单子查询,不包含子查询和union
primary包含union或者子查询,最外层的部分标记为primary
subquery一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询
derived派生表——该临时表是从子查询派生出来的,位于form中的子查询
union位于union中第二个及其以后的子查询被标记为union,第一个就被标记为primary如果是union位于from中则标记为derived
union result用来从匿名临时表里检索结果的select被标记为union result
dependent union顾名思义,首先需要满足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询
subquery子查询中第一个SELECT语句
dependent subquery和DEPENDENT UNION相对UNION一样

table

对应行正在访问哪一个表,表名或者别名

  • 关联优化器会为查询选择关联顺序,左侧深度优先
  • 当from中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列
  • 当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id

注意:MySQL对待这些表和普通表一样,但是这些“临时表”是没有任何索引的。

type

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

类型说明
All最坏的情况,全表扫描
index和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多
range范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range
ref一种索引访问,它返回所有匹配某个单个值的行。此类索引访问只有当使用非唯一性索引或唯一性索引非唯一性前缀时才会发生。这个类型跟eq_ref不同的是,它用在关联操作只使用了索引的最左前缀,或者索引不是UNIQUE和PRIMARY KEY。ref可以用于使用=或<=>操作符的带索引的列。
eq_ref最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效)
const当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。当主键放入where子句时,mysql把这个查询转为一个常量(高效)
system这是const连接类型的一种特例,表仅有一行满足条件。
Null意味说mysql能在优化阶段分解查询语句,在执行阶段甚至用不到访问表或索引(高效)

possible_keys

显示查询使用了哪些索引,表示该索引可以进行高效地查找,但是列出来的索引对于后续优化过程可能是没有用的

key

key列显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len

key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 。

ref

ref列显示使用哪个列或常数与key一起从表中选择行。

rows

rows列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值。

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操作,在找到第一匹配的元组后即停止找同样值的动作


链接:https://www.jianshu.com/p/ea3fc71fdc45
來源:高广超的简书

 

小编积累多年的干货文档免费赠送,包含前端后端和测试,系统架构,高并发处理,优化等

MySQL中的EXPLAIN的详解 explain(执行计划),使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。– 表的读取顺序– 数据读取操作的操作类型– 哪些索引可以使用– 哪些索引被实际使用– 表之间的引用– 每张表有多少行被优化器查询EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。版本情况。 阅读详情

相关推荐

一文说清楚 MySQL 的 explain

explain 是 MySQL 提供的一个用于分析查询语句执行计划的工具。它不会实际执行查询语句,而是返回 MySQL 执行该查询的详细计划,包括如何连接表、使用什么索引、扫描多少行数据等信息。通过这些信息,开发者可以了解查询语句的执行过程,判断索引是否被有效使用,从而有针对性地进行优化。explain 在 MySQL 查询优化中具有重要的作用,它能帮助我们深入了解查询语句的执行计划,发现性能瓶颈。

LBJ_2016_1984_12_30 930

mysql如何explan优化sql_sql优化最佳实现(Explain介绍)

Explain工具介绍使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQLe.xexplain select * from user where id =2;explain查询结果中的列1.id列id列是 select 的...

weixin_34506795的博客 462

Innovus时钟树综合CTS实战:从原理到signoff的完整指南

时钟树综合(CTS)是数字后端实现中保障同步电路时序收敛的核心环节,其本质是在物理层面构建低偏斜、可控延迟的全局时钟分发网络。它基于静态时序分析(STA)原理,通过平衡clock skew、insertion delay、transition time与功耗面积等多维约束,对抗工艺电压温度(PVT)变异带来的时序不确定性。技术价值在于支撑GHz级高频芯片的setup/hold签核,广泛应用于CPU、GPU、AI加速器等复杂SoC的Innovus后端流程。本文聚焦CTS在Innovus工具链中的工程落地,覆盖

weixin_28523493的博客 223

MySQL调试--explain命令详解

本文介绍MySQL的explain命令的用法及其结果的含义。

IT利刃出鞘的博客 1490

小程序强制更新避坑指南:手把手教你实现无缝升级

本文详细解析小程序强制更新的实现方法,重点介绍wx.getUpdateManager API的使用技巧,帮助开发者规避冷热启动机制下的版本管理陷阱。通过实战案例展示如何设计多级更新提示策略,确保用户无缝升级,提升小程序版本更新率。

star的博客 280

别再乱调了!Zygo MetroPro软件滤波功能保姆级指南,从均值到鲁棒高斯样条一次讲清

本文深入解析Zygo MetroPro软件的滤波功能,从均值滤波到鲁棒高斯样条等九种算法,帮助用户根据测量对象特性选择最佳滤波组合。通过真实工业案例和参数配置指南,提升光学测量数据的准确性和效率,特别适用于硅晶圆、光学镜片等精密测量场景。

weixin_30888413的博客 156

MySql之Explain(*)

一.explain简介 explain模拟优化器执行SQL语句,在5.6及以后的版本中,除过select,其他比如insert,update和delete均可以使用explain查看执行计划,从而知道mysql是如何处理sql语句,分析查询语句或者表结构的性能瓶颈。explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 作用: (1)表的读取顺序 (2)数据读取操作的操作类型 (3)哪些索引可以使用 (4)哪些索引被实际使用 (5)表之间的

weixin_42408447的博客 606

SYSU-MM01数据集评估避坑指南:从RGB/IR图像理解到Python评估脚本调优

本文详细解析了SYSU-MM01数据集在跨模态行人重识别(ReID)评估中的关键技巧与常见陷阱。从RGB/IR图像理解到Python评估脚本优化,提供了数据评估模式选择、single-shot/multi-shot差异分析、特征文件处理规范等实用指南,帮助研究者避开指标异常问题,提升评估效率与准确性。

weixin_29044713的博客 196

mysql explain ref null_MySQL Explain详解

MySQL Explain详解简介执行计划(query Execution plan)语法explain select * from tableexplain 中的列expain出来的信息有10列,分别是id,select_type,table、type,partitions,possible_keys,key,key_len,ref,rows,Extra,下面对这些字段出现的可能进行解释:一、I...

weixin_42099755的博客 2217

Python 实现生命游戏及进化模拟完整指南

生命模拟是进化计算的一个特定子集,模拟了自然界中所观察到的自然过程,例如粒子或鸟群的聚集方式。生命模拟只是用来探索和优化问题的模拟形式之一,还有很多其他形式的模拟,可以更好地建模各种过程,但它们都源于康威生命游戏 (Conway’s Game of Life)。在本节中,我们将介绍生命模拟的基本概念,并使用 Python 实现康威生命游戏。

盼小辉丶的博客 7万+

LSTM 双向 Bi-LSTM

LSTM 双向 Bi-LSTM

jacke121的专栏 1516

MySQL中EXPLAIN详解

EXPLAIN作为MySQL的性能分析神器,读懂其结果是很有必要的,然而我在各种搜索引擎上竟然找不到特别完整的解读。都是只有重点,没有细节(例如type的取值不全、Extra缺乏完整的介绍等)。 文章目录 ...

wh柒八九的博客 5919

【Windows Server 2019】活动目录 (Active Directory) ——理论

博文介绍了活动目录 (Active Directory) 的定义,作用以及与 DNS 的关系。同时也介绍了AD的组织结构,包括域控制器,子域,对象,属性,容器,组织单位,域间信任等术语的解释,实验拓扑图。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 7746

mysql中EXPLAIN详解

大家好。众所周知,MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式。在日常工作过程中,我们可以使用EXPLAIN语句来查看某个查询语句的具体执行计划, 今天我们就来聊一聊EXPLAIN语句。如果我们想看看某个查询的执行计划的话,可以在具体的查询语句前边加一个EXPLAIN,就像这样:下面我们仔细聊一下每个列是干什么的。

qq_41534540的博客 1730

解锁RK3588芯片超强网络性能:多队列网卡与IRQ负载均衡实战

摘要:本文针对RK3588芯片的网络性能优化展开研究,重点探讨了多队列网卡配置和IRQ负载均衡技术。通过配置多队列网卡,将网络流量分散到多个队列处理,显著提升了吞吐量(测试显示提升67%)。同时,通过IRQ负载均衡配置使中断请求均匀分配到各CPU核心,CPU利用率降低至35%。文章详细介绍了配置步骤、测试方法,并分析了常见问题及解决方案。这些优化措施有效提升了RK3588在网络录像机、边缘计算等应用场景中的性能表现,为高性能网络应用提供了有力支持。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 498

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

mysql之EXPLAIN 详解

EXPLAIN命令是 MySQL 查询优化的 “瑞士军刀”。熟练掌握EXPLAIN的输出字段含义,结合案例分析,能帮助我们深入理解 MySQL 执行计划,快速定位性能瓶颈,找到优化方案,构建高性能的 MySQL 应用。参考:https://relph1119.github.io/mysql-learning-notes/#/mysql ,推荐理解本文之后去看原书,原书有一定深度需前后贯穿仔细理解。

qq_43460315的博客 1845

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Mysql的Explain详解

Mysql的Explain详解1、什么是Explain?2、Explain的两个变种2.1、explain extended2.2、explain partitions3、explain展示出来的数据列详解3.1、id列3.2、select_type列3.2.1、simple---简单查询3.2.2、primary---复杂查询3.2.3、subquery---子查询3.2.4、derived---衍生查询3.2.5、union---联合查询3.3、table列3.4、type列3.4.1、const, s

qq_41931364的博客 5942

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

mysql EXPLAIN详解

使用EXPLAIN语句可以帮助你查看查询是否有效地利用了索引,通过理解执行计划,你可以优化查询,避免全表扫描,提高查询效率。如果查询没有使用索引或索引没有发挥预期作用,可能需要创建新的索引或调整现有索引。

qq_35082497的博客 1242

一文了解MySQL explain详解

MySQL 的 EXPLAIN 是一个用于查询优化的关键字。它用于分析和评估查询语句的执行计划,帮助开发者理解查询语句的性能问题以及优化查询的方式。使用EXPLAIN关键字,可以获取关于查询执行计划的详细信息,包括表的访问顺序、连接方式、索引使用情况等,这些信息能够帮助你确定查询是否有效利用了索引,以及是否存在潜在的性能瓶颈。要使用EXPLAIN执行以上语句后,MySQL会返回一个结果集,包含了查询执行计划的详细信息。

时间如瑾 代码如诗 1641

【MySQL01】【 Explain 命令详解】

最近在读《MySQL 是怎样运行的》一书,后续会随机将书中部分内容记录下来作为学习笔记,部分内容经过个人删改,因此可能存在错误,如想详细了解相关内容强烈推荐阅读该书。

猫吻鱼的博客 1326

【MySQL之Explain详解】

本文介绍了MySQL中EXPLAIN关键字的作用及返回字段含义。EXPLAIN用于分析SQL执行计划,帮助优化慢查询。重点解析了id(执行顺序)、select_type(查询类型)、table(访问表)、type(访问方式)等关键列

qq_40864151的博客 1769

mysql 的explain

就像书架上的书,你要找的内容可能需要翻阅很多本书,rows 就是 MySQL 估算需要翻阅的数量。行数越少,效率越高。书架上有多个索引卡片(possible_keys),key 是最终选中的卡片,告诉你用哪个索引来找书。假设书架的索引卡片按字母排序,ref 就是你在索引卡片上找的具体字母,比如“找姓氏以 A 开头的书”。想象你在书架上找一本书(查询数据),书架上有许多索引卡片(索引),possible_keys 就是。想象你是一名考古学家,在沙漠中寻找宝藏(数据查询),type 就是你选择的。

qq_39201004的博客 1762

MySQL Explain详解

最近慢慢接触MySQL,了解如何优化它也迫在眉睫了,话说工欲善其事,必先利其器。最近我就打算了解下几个优化MySQL中经常用到的工具。今天就简单介绍下EXPLAIN。 内容导航 idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra   环境准备 MySQL版本: 创建测试表 CREATE TABLE peo

hansam 的专栏 6856

Mysql Explain详解

一、背景 在日常工作中,可能会收到一些超时或慢响应的告警,最根到底可能是因为一些执行时间比较的SQL语句,这就跟我们平时开发需要注意细节相关了。那么找到这些SQL语句怎么优化呢?到底是哪里的问题导致SQL执行时间长呢? 这个时候Explain命令尤其重要,它可以查看该SQL语句有没有使用上索引、使用了哪个索引、有没有做全表扫描、有没有使用临时表等等。下面都是基于mysql 8进行案例说明的。 ...

e5354966xieo1的博客 363
上一篇: 中小型网站架构分析及优化
下一篇: Sql优化器究竟帮你做了哪些工作?
dev666
博客等级 码龄9年 100粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值