一、什么是explain?
模拟优化器执行SQL语句,可以知道语句的执行过程,从面分析SQL语句或是表结构的性能瓶颈。
二、怎么使用?
# explain 语句
EXPLAIN SELECT APP_USER_ID_,PHONE_ FROM uc_front_user WHERE PHONE_ = '13471027409'
三、explain各个字段的意思?
1、id
查询的序列,表示表的加载顺序。
三种情况:
1、id相同,从上往下执行
2、id不同,数值越大,优先级越高,越先执行
3、两种都有,id大的先执行,相同的由上往下执行
2、select_type(表的查询类型)
3、table
来自那一张表
4、partition
分区一般情况下我们的查询语句的执行计划的partitions列的值都是NULL
5、type
查询使用何种类型,从好到坏
null>system>const>eq_ref>ref>range>index>all
6、possible_key
可能用到的索引,一个或是多个
7、key
被用到的索引,null没有用到
8、key_len
用到索引的长度,在不损失精确性的前提下, 长度越短越好 。它是由这三个部分构成的。
● 对于使用固定长度类型的索引列来说,它实际占用的存储空间的最大长度就是该固定值,对于指定字符集的变长类型的索引列来说,比如某个索引列的类型是VARCHAR(100),使用的字符集是utf8,那么该列实际占用的最大存储空间就是100 × 3 = 300个字节,utf8mb4则是100 × 4 = 300个字节
● 如果该索引列可以存储NULL值,则key_len比不可以存储NULL值时多1个字节。
● 对于变长字段来说,都会有2个字节的空间来存储该变长列的实际长度。
笔者这里PHONE_索引用用的是utf8mb4,长度为64,可以为null,所以key_len=64*4+1+2=259。
9、ref
显示索引的那一例被使用到,有可能是常量。不用关注。
10、rows
找到所需的数据,需要查找多少行。行数越少,就越好。
11、filtered
MySQL在计算驱动表扇出时采用的一个策略,不用关注。
12、extra
当extra字段中出现using filesort、using temporary信息,那就要进行语句优化了。