explain介绍
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。
1、表的读取顺序
2、数据读取操作的操作类型
3、哪些索引可以使用
4、哪些索引被实际使用
5、表之间的引用
6、每张表有多少行被优化器查询
explain列含义
id:相同,执行顺序由上至下 ;不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
select_type: 表示select的类型;SIMPLE 代表简单表,不用表连接或子查询,PRIMRY 主查询(外层查询),UNION UNION中的第二个或者后面的查询语句,SUBQUERY 子查询中的第一个SELECT;
table:输出结果集的表;
ref:显示索引的哪一列被使用了,如果有可能是一个常数,哪些列或常量被用于查询索引列上的值
possible_keys:查询中可能用到的索引;
key:查询中实际用到的索引;
key_len 索引的长度;
rows 扫描的行数;
type:访问类型 下面几种:
下面的值,从左到右,性能由最差到最好
ALL,index,range,ref,eq_ref,const,system,NULL
ALL:全表扫描
index:索引全扫描
range: 索引的范围扫描 用于<,<=,>,>=,between等操作
ref:使用非唯一索引扫描或者唯一索引的前缀扫描;
eq_ref:使用唯一索引扫描,多表链接中使用primary key或unique key作为关联条件;
const/system:单表中只有一个匹配行,查询速度快,根据主键或唯一索引进行的查询;
NULL:mysql不用访问表或者索引,直接能够得到结果
Extra
Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。
Using temporary:使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
Using index:表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
Using join buffer:表明使用了连接缓存,比如说在查询的时候,多表join的次数
非常多,那么将配置文件中的缓冲区的join buffer调大一些。
EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
部分统计信息是估算的,并非精确值
在5.6以及以后的版本中,除过select,其他比如insert,update和delete均可以使用explain查看执行计划