Explain命令详解,我读小学的侄儿都能看懂

😺 什么是Explain

  • 使用 Explain 关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。通过 Explain 可以知道表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。在 select 语句之前增加 explain 关键字 ,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息

  • mysql 对 Explain 的官方文档描述

😺 Explain 面容

😈 😈 如何执行 Explain

EXPLAIN SELECT * FROM tb_article;

😈 😈 结果展示

在这里插入图片描述

😺 各字段详解

  • partitionsfiltered 对于开发人员来说,分析的意义不大,暂且略掉

😈 😈 id列

  • id列的编号是select的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
  • id列越大执行优先级越高
  • id相同则从上往下执行
  • idNULL最后执行

😈 😈 select_type列

表示简单还是复杂的查询

  • 1)simple:简单查询。说明没有子查询和union
  • 2)primary:复杂查询中,最外层的select
  • 3)subquery:包含在 select 中的子查询
  • 4)derived:包含在 from 中的子查询
explain 
select 1⃣️
	( select 1  2⃣️
	  from tb_coffee 
	  where id = 1) 
from ( 3⃣️ select * from film where id = 1 ) t1 ;

通过SQL可以得到:

  • 1为 primary
  • 2为 subquery
  • 3为 derived

😈 😈 table 列

这一列表示 explain 的一行正在访问哪个表

😈 😈 type列 (非常关键的列!)

这一列表示访问类型,也就是mysql 查当前行底层是如何执行的
最优到最差排序:NULL > system > const > eq_ref > ref > range > index > ALL

🌈🌈🌈 NULL

虽然是 NULL ,但他是最🐮👃的,mysql 直接在优化阶段就能拿到值,压根儿都不需要访问表或者走索引

explain select max(id) from tb_article;

在这里插入图片描述

🌈🌈🌈 const:

顾名思义,就像查常量一样。可以理解为常量查询、结果集只有一条,查询效率非常高,比如说:主键索引,唯一索引等

🌈🌈🌈 system:

首先他的优先级是比 const 还要高的。他算作const的一种特例。从一张表去查询,而且这张表只有一条记录。

🌈🌈🌈 eq_ref:

简单理解就是通过主键关联或唯一键关联,我只会查询一条记录,效率也是非常高的

🌈🌈🌈 ref:

不使用唯一索引,而是使用普通索引或者是联合索引的前缀查询出来的结果集,有多个行记录

🌈🌈🌈 range:

效率还可以,相当于也是用到了索引查找,但是他查的是一个范围。但是对于结果集太大,效率也不是太高,所以建议做分页这些操作

🌈🌈🌈 Index:

Index 表示【全索引扫描】。扫的是二级索引(非主键索引)

🌈🌈🌈 ALL:
地球人都知道吧,ALL,全表扫描。扫的是聚簇索引所以的叶子节点,也就是data 数据,叶子节点

😈 😈 possible_keys列

  • 人话讲:可能会用到的索引!

😈 😈 key 列

  • mysql 真正执行的时候用到的索引

🌈🌈🌈 为什么有时候possible_keys列有值,但是keysNULL

  • 索引选择他内部有些成本计算的,有可能他分析的情况下会用到索引,但真正计算的时候不走索引还快一点。就类似于:我用全表扫描,效率可能还高一点

😈 😈 key_len列

  • 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。

  • 比如说我创建了一个 联合索引 idx_name_age('name'、'age')那么通过key_len就可以知道我这个联合索引是只用了name一个索引还是age这两个索引都用上了,这样就有利于我们对于索引是否命中可进行具体分析

😈 😈 ref 列

  • 就是索引关联查询的这个字段,表示查找值所用到的列或者常量,常见有:const(常量)、字段名

😈 😈 rows列

  • 这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。这个行数只能作为一个参考值,并不是扫描多的就比行数扫描少的效率低。

  • 举个例子:有可能走索引他会扫描4万多行,不走索引全表扫描9万多行,但实际mysql底层不一定会选走索引的,他有一套自己的计算规则(cost 计算成本),有可能你走索引还需要回表啥的,还更慢!所以 rows 列的数据只能作为参考

😈 😈 Extra列

这一列展示的是额外信息,Extra列意义不是很大,以下列举几个常见的:

🌈🌈🌈 Using Index 覆盖索引

他并不是索引,他只是查询的一种方式。【覆盖索引 约等于 索引树】他表示我们要查找的结果字段,在索引树里面全部都包含,我只需要索引树就能查找到结果了,不需要回表。比如说type = index实际上他就是覆盖索引的方式进行查询

  • 索引树本身就是排好序的

🌈🌈🌈 Using Where

  • 用到了where条件,最普通的查询。一般这种优化策略就是加个索引

🌈🌈🌈 Using filesort

  • 用到了这个表示是没有走索引的哈,他用的是聚簇索引,也就是整张表,整个叶子节点的数据

🌈🌈🌈 Using Index 和 Using filesort 差别

不管 Using Index 还是 Using filesort,他都是从磁盘加载到RAM,索引树也是在磁盘上的

  • Using filesort :直接是聚簇索引,没有用到索引树,扫描的是全表,聚簇索引包含叶子节点
  • Using Index :用到了二级索引,相当于走了索引的
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值