作者:
可爱猪猪
-帅锅一枚
作者的网名很阔爱,如果喜欢本文章一定要点 喜欢 或者 打赏,拜托~
作者一直在进步,需要你们的支持和鼓励,谢谢!
人生理想:在程序猿界混出点名堂!
请读者,认真读完这篇文章,一定可以解开你心中多年的谜团!
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
5.extra
以下两个比较重要:
- using index:出现这个说明mysql使用了覆盖索引,避免访问了表的数据行,效率不错!通俗的说也就是查询的列不需要回表,在索引树上就能拿到结果
- using where:这说明服务器在存储引擎收到行后将进行过滤。有些where中的条件会有属于索引的列,当它读取使用索引的时候,就会被过滤,所以会出现有些where语句并没有在extra列中出现using where这么一个说明。