如何分析mysql中Explain的执行结果3

70 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

key_len

用到索引所占用的字节数。规则如下: char/varchar(n):如果非utf-8 则纯数字或者字母都是1个字节;汉字则是3个字节 char(n)=3n; varchar(n)=3n+2,其中2来存取字符串长度【因为varchar是变长字符 串】; tinyint:1字节;smallInt:2字节;int:4字节;bigint:8字节; date:3字节;timestamp:4字节;datetime:8字节; 如果索引允许为NULL,则额外需要1个字节存储;索引最大长度为768个字节,字符串过长,则会将前部分字符串作为索引。

Using Index

使用到了覆盖索引(要查询的字段为某个索引值或者联合索引的一部分 image.png

Using Where

查询语句使用到了where,且查询条件是非索引字段。

Using index Condition

查询语句使用到了where,且查询条件是索引字段。

Using temporary

mysql需要创建一张临时表来处理数据。 image.png

Using fileSort

将用外部排序而不是内存排序 image.png

Select tables optimized away

使用聚合函数比如max,min来查询索引字段。如果非索引字段那么Extra为NULL image.png

索引注意事项

1.索引字段上不要进行函数操作:索引树是针对某个数值创建的索引,一旦运算,可能索引树找不到对应值,从而走全表扫描。 2.联合索引中范围条件之后的索引失效:索引树是有序的数据结构,一旦有了范围,那么之后索引字段全局会变成无序。 3.尽量使用覆盖索引 4.is (not) null 一般无法使用索引 5.like ‘abc%’ :前模糊查询会走查询,可以理解成字符串是ASCII,比较每个字符,相当于常量查询

重点

Mysql内部会有各种成本分析,或许查询的是索引数据,但是当总数量很少时会走全表扫描,即上面结论仅供参考,并非一成不变。