sql分析——了解mysql中的explain关键字

现在的面试要求越来越高了,会点sql优化似乎不是加分项,而是必备项
面试官问:你对sql优化有何见解?
我:建索引(下意识的说)
面试官:还有呢?
我:············

了解一下explain关键字,至少你还能说点啥,不仅面试有用,实习开发也有用哦

先百度一下explain的解释:

mysql explain的作用是模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理用户的SQL语句,提高数据检索效率,降低数据库的IO成本。

看完这个是不是感觉面试还能说一句了

但是好像不太会用,这个explain用在哪里的?有什么语法嘛?
什么语法其实我也不知道,凭语感吧,给两个例子看你就秒懂
在这里插入图片描述
简单的介绍一下这里面的字段分别是什么吧~

id

id: 可以理解为是一个优先级
(然后分了三种情况,优先级相同,优先级不同,优先级有相同有不同)

情况1在这里插入图片描述
如果id相同,它就会根据table字段,自上而下顺序执行


情况2
在这里插入图片描述

如果是子查询,id的序号会递增,id越大,优先级越高


情况3
在这里插入图片描述
像这种,from了一个虚表(子查询查出来的表),先走id等于2的表,然后从上至下走id等于1的表。
derived2是什么东西呢?
derived:派生、衍生。 也就是说衍生的一个虚表,根据谁衍生的呢,根据id的2的表,对应一下也就是t3表咯。


select_type

select_type: 常见的有:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT

SIMPLE:对于select来说,如果是单表的简单的查询,就是SIMPLE(一般不包含union 不包含子查询)
在这里插入图片描述


PRIMARY:当多个子查询的时候,它就是最外层的那个
SUBQUERY:表示子查询咯
在这里插入图片描述


DERIVED:看上面,我写了一个小提示


UNION:如果第二个select在union之后就会标记成UNION;若UNION包含在FROM子句的子查询中, 外层select将被标记为DERIVED。


UNION RESULT:从union表获取结果的seect。

table

table:这个就不用多说了,能看到这里的,基本上秒懂了

partitions

代表分区表中的命中情况,非分区表,该项为NULL。一般情况下我们的查询语句都是NULL。

type

type:这个字段有点东西,非常有用
他表示查询使用了何种类型,从好到差排:
system>const>eq_ref>ref>range>index>ALL (这些排序种类远不止这些,只不过常见的是这些)
要是能达到range或者ref算还可以的了(前提是数据量特别大的时候)

system: 当表里只有一条记录一个字段的时候,存储引擎用MYISAM或者Memory,他就会出现,一般可以理解为系统表才有这样的情况,实际需求上不太存在这样的。(为什么INNODB不行?因为他统计数据不是精确的)


const: 当我们根据主键或者唯一二级索引列与常数进行等值匹配的时候,对单表的访问方法就是const。
在这里插入图片描述


eq_ref: 在连接查询时,如果被驱动农是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二.级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是`eq_ref
在这里插入图片描述
ref: 当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是’ref。
在这里插入图片描述
range: 对于查询一个范围区间的操作,就会出现range,前提是那个字段必须是主键
在这里插入图片描述
index: 一般是对于扫描一个二级索引才会出现的
在这里插入图片描述
ALL: 一般就是全表扫描咯
在这里插入图片描述


possible_keys

翻译成中文,可能_键,也就是可能含有的索引。这个会显示你的sql可能会用到的索引,如果没有那就是空,如果有他就会显示用的具体哪个索引
在这里插入图片描述

key

这个表示MySQL在查询时实际用到的索引。在执行计划中可能出现possible_keys列有值,而key列为null,这种情况可能是表中数据不多,MySQL认为索引对当前查询帮助不大而选择了全表查询。如果想强制MySQL使用或忽视possible_keys列中的索引,在查询时可使用force index、ignore index

key_len

这个表示索引中所使用的字节数,个人感觉仅供参考

ref

如果说单纯的根据主键查询,那就是const,如果是其他的普通字段,那就是null
在这里插入图片描述
对于多表的主键关联查询,就会出现
在这里插入图片描述

rows

这个表示预估要查多少条记录,这个值越小越好,说明效率相对高一点

filtered

某个表经过搜索条件过滤后剩余记录条数的百分比,百分比越高越好一点

extra

字面意思理解就是,额外的信息 ,这个也挺有用的,就像是idea里的提示一样,经常会拿去参考
先来个最简单的,这里没有使用表,它会提示没有表在用
在这里插入图片描述
再来个,像这个明显查出的一定是空,所以它的提示是不可能的where条件
在这里插入图片描述
再来个正常的,她也会显示用了where条件匹配,等值连接在这里插入图片描述

总结

一般常用的就看type、select_type、rows、extra
type可以理解为复杂度,看看哪个效率高,system>const>eq_ref>ref>range>index>ALL
select_type看成sql类型,是普通的还是用了主键,又或者用了联合
rows看成预计需要查询的条数
extra看成提示,参考看看有没有改进措施

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值