explain详解

explain展示
在这里插入图片描述

id:

select识别符,可理解为执行顺序
相同时顺序从上到下
子查询中,id越大越优先执行
例如出现子查询:

explain
select *
from world.country c 
join world.city c3 on c3.CountryCode = c.Code 
where c.Code in (select c2.CountryCode from world.countrylanguage c2 where c2.IsOfficial = 1)

在这里插入图片描述

select_type:

select子句类型,包括
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)
(6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)
(8) DERIVED(派生表的SELECT, FROM子句的子查询)
(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
(10)MATERIALIZED(物化:用于子查询(比如在IN/NOT IN子查询以及 FROM 子查询)优化,即条件下推到物化表:第一次子查询保存为临时表,后续直接访问临时表)

table:
表名,可能是简称

type:

访问方式,性能由差到好:ALL、index、range、 ref、eq_ref、const、system、NULL
阿里规范要求:至少range,要求reg,最好const
all:full table scan,全表遍历

例如:select * from world.country c 

index:full index scan,全表遍历,但仅遍历索引树

例如:select Name from world.country c 

range:只检索给定范围的行,使用一个索引来选择行

例如:select * from world.country c where Name like "China%"
select * from world.country c where Name in ("China","America")

ref:索引要跟某个参考值相比较,该参考值可能为一个常数或者其他查询的结果值

例如:select * from world.country c where Name = "China"

eq_ref:类似ref,但使用的索引是唯一索引,且是联合查询

如设置id_card为唯一索引:
select * from test.`user` u, test.test t where t.id_card = u.phone 

const、system:mysql将查询优化为一个常量时,出现const,如where通过主键、唯一索引查找,system是const的特例
null:mysql优化过程中分解语句,甚至不需要访问表或索引

possible_keys:
可能使用的索引,不一定使用到

key:
实际使用到的索引
key_len:
索引中使用的字节数:不损失精度情况下,越短越好
ref:
列与索引的比较:那些列或常数被用于查找索引列上的值
rows:
结果集行数

extra:

Using where:
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
Impossible where:这个值强调了where语句会导致没有符合条件的行。
Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
Using index:该值表示相应的select操作中使用了覆盖索引(Covering Index)
Index merges:当MySQL 决定要在一个给定的表上使用超过一个索引的时候,就会出现以下格式中的一个,详细说明使用的索引以及合并的类型

Using sort_union(...)、Using union(...)、Using intersect(...)

Using index condition:由engine来进行where条件的筛选

在MySQL中,EXPLAIN是一个关键字,用于查询SQL语句的执行计划和索引使用情况。使用EXPLAIN可以帮助我们了解MySQL如何处理我们的查询语句,并对查询进行优化。 EXPLAIN命令会返回一个包含12列信息的结果集。这些列包括:id,select_type,table,partitions,type,possible_keys,key,key_len,ref,rows,filtered,Extra。每一列都提供了有关查询执行的详细信息。 - id列表示查询的标识符,常用来区分查询的不同部分。 - select_type列表示查询的类型,例如简单查询、子查询、联合查询等。 - table列表示与查询相关的表名。 - partitions列表示查询涉及的分区信息。 - type列表示查询的访问类型,包括全表扫描、索引扫描、范围扫描等。 - possible_keys列表示可能用到的索引。 - key列表示实际使用的索引。 - key_len列表示索引的长度。 - ref列表示查询中使用的索引引用。 - rows列表示查询返回的行数估计值。 - filtered列表示查询结果的过滤率。 - Extra列提供了额外的信息,如是否使用了临时表、是否使用了文件排序等。 通过分析EXPLAIN的结果,我们可以判断查询是否使用了索引,是否存在全表扫描等问题,从而进行查询性能的优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mysqlexplain详解](https://blog.csdn.net/weixin_44143114/article/details/118526637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MySQL数据库:第十七章:Explain详解](https://blog.csdn.net/java_wxid/article/details/111881486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

崔丝塔娜炮手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值