使用expalin作为前缀可以查看当前sql语句的执行效率,以便于优化sql语句。explain的参数主要有十个分别为:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra。
explain的作用:
例如:
1、id:id的值越大则代表越先执行。
2、select_type:常见的主要有如下六个:主要用于区别普通查询、联合查询、子查询等复杂的查询。
simple:简单的select查询,并且查询中不含子查询或者union。
primary:查询中如果有包含任何复杂的子操作,最外层查询则会被标记为primary。
subquery:在select或者where列表中包含的子查询。
derived:在from列表中包含的子查询被标记为derived,就是临时表,Mysql会递归这个子查询。
union:在union后面的select查询,则被标记为union。
union_result:从union表获取结构的select。
例下面这张表:
前面两个则是为主查询;左连接,a表需要全表扫描查询全部那么type则为ALL,b表只是主键唯一索引查找type则为eq_ref;后面两个则是union查询;右连接,b表虽然是主键id查询,但是也需要全表扫描,所以type也是ALL,a表则是普通不唯一的索引查询,所以type则为ref。
3、type:查询的类型主要有(最好到最坏的顺序):system>const>eq_ref>ref>range>index>all(实际工作查询至少达到range,最好能达到ref)
system:表只有一行记录(系统表),这是const类型的特例,平时不会出现在工作中,可以忽略不计。
const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,单表查询并且是对主键或者唯一的索引进行查询。
eq_ref:也是通过唯一索引的方式查询,和const差不多,区别是eq_ref大部分都是用在多表查询中,const只是单表查询。
ref:普通非唯一的索引
range:只检索给定范围的行,一般就是在where语句中用了between、<、>、in等的查询。
index:只是从遍历索引树,比all快。
all:遍历整张表进行匹配。
4、possible_keys(理论上):显示可能应用在这张表中的索引,一个或多个,但不一定被实际查询使用。
5、key(实际上):查询中实际使用到的索引,如果为null则代表没有使用索引,如果使用了复合索引那么possible_keys中会显示null,只在key中显示对应的复合索引。
6、key_len:显示的值为索引字段的最大可能长度(即通过表定义计算而得),并非实际使用长度。在不损失精确性的情况下,越短越好。
计算公式:key的字节数*3(utf-8的字节数)+(如果允许为null则要再加1,如果不为null则不用)。
例如:4(char)*3(utf-8)+1(null)
7、ref:在where中用了什么条件则会显示什么值:
例如:
8、extra:额外的条件主要有这几个:
Using filesort:说明mysql会对数据使用一个外部的索引,内部的索引无法进行使用,一般情况是用了排序(order by),但是排序并没有使用到索引,或者索引使用不了(复合索引没有按照顺序进行使用)。
Using temporary:使用临时表进行分组(group by)。
Using index:使用了复合索引并且是按照顺序select的方式。(这个也是进行全表扫描,但是这个是在内存中进行操作的所以比io操作快)
Using where:使用了where
Using join buffer:使用了join缓冲
Imposible where:where中的语句为false,例如name=123and name =123456(并不可能存在)。