Mysql explain中的关键字段(通俗易懂篇)

作者:可爱猪猪 - 帅锅一枚
作者的网名很阔爱,如果喜欢本文章一定要点 喜欢 或者 打赏,拜托~
作者一直在进步,需要你们的支持和鼓励,谢谢!
人生理想:在程序猿界混出点名堂!

请读者,认真读完这篇文章,一定可以解开你心中多年的谜团!

1.possible_keys

条件字段在索引中存在,则将该索引列出。
注意:如果用到了索引,也就是key不为空,但possible_keys为空,那么使用了覆盖索引。
所谓覆盖索引,就是查询的时候select 的列就是索引字段。

2.key

使用的索引
这里使用的索引,并不代表一定用上了索引,用没用索引,以及索引如何用的还要取决于type字段

3.key_len

索引字段的长度,跟查询的结果集无关。只是跟索引字段的定义的长度有关。

这里需要搞懂两个问题:

  • 如何计算索引长度
    我直接说结果免的去看网上那么多测试和长篇大论
    一般数据库采用utf-8,
    varchar类型的长度为3*len+2
    char类型的长度为3len
    int类型的长度4
    bigint的长度是8
    此外,如果是null,在以上的基础+1,
    题外话:mysql建议字段设置为not null来节省空间,此外int(10)并不是说占10个字节或者10位的长度,而只是不满10位填0,仅展示用
    举例:
    utf-8下 a varchar(10) 长度为3(utf-8)
    10+2(varchar)+1(null) = 33

  • key_len的作用
    主要看用的联合索引的长度,
    对于联合索引来说,只能根据type和key来判断用没有用上索引,用的哪个索引,但是索引用的哪个字段并推理不出,所以根据key_len和最左原则来推断。
    至于网上有些文章说它越小越好,不一定有道理。比如联合索引全部使用key_len就比较大,但性能就好。

4.type

表示是否用上索引,以及索引是如何使用的,此字段决定索引的性能。
先看结果,性能由低到高:
ALL<TYPE<RANGE<REF<CONST

  • ALL:全表扫描
  • TYPE:扫描全表的顺序是按照索引顺序扫描的
  • RANGE:between或者“>”这种符号的时候会出现这个
  • REF:经作者多次验证发现,非唯一索引或者非主键,也就是你的查询条件有可能返回多条结果,则为REF
  • CONST:经作者多次验证发现,不管是联合唯一索引还是主键,也就是你的查询条件是唯一的,则为CONST

官方一点的解释可参考这篇文章:
https://www.cnblogs.com/mydriverc/p/7086494.html

5.extra

以下两个比较重要:

  • using index:出现这个说明mysql使用了覆盖索引,避免访问了表的数据行,效率不错!通俗的说也就是查询的列不需要回表,在索引树上就能拿到结果
  • using where:这说明服务器在存储引擎收到行后将进行过滤。有些where中的条件会有属于索引的列,当它读取使用索引的时候,就会被过滤,所以会出现有些where语句并没有在extra列中出现using where这么一个说明。

微信公众号:可爱猪猪聊程序,每天连载更新,内容易懂、精彩不断