Mysql的explain语句

一、id:

代表select语句的编号,如果是连接查询,表之间是平等关系,select 编号都是从1开始,如果某select中有子查询,则编号递增;

二、select_type(查询类型):


Mysql的explain语句_第1张图片
select_type

三、table(查询针对的表):

1.实际的表名:select * from t1;

2.表的别名:select * from t2 as tmp;

3.derived:from型子查询时

4.null:直接计算得结果,不用走表

四、possible_key(可能用到的索引):

注意:系统估计可能用的几个索引,但最终只能用1个;

五、key(最终用的索引)

六、key_len(使用的索引的最大字节数)

注:不同的字符编码有不同的计算方式,如1个utf8字符等于3个字节;如果字段类型是null,那单个字段的索引字节数需要 +1,如果字段类型为非定长类型,比如varchar,那字节数需要再 +2

七、type(查询的方式):

各个值代表查询的效率比较:all < index < range < ref < eq_ref < const,system,null

注:这个列非常重要,是分析“查询过程”的重要依据;

1.all:从表的第1行往后,逐行做全表扫描,没有使用索引

例:explain select name from table where name='xxx' \G

2.index:扫描所有索引节点,相当于index_all,有几种情况会出现index:

(1).索引覆盖的查询情况下,能利用上索引,但是又必须全索引扫描

例:explain select id from table where id=1 or id+1>20\G

(2).利用索引来进行排序,但取出所有的节点

例:explain select id from table order by id asc \G

注:没有加where条件,就得取所有索引节点,同时又没有回行,只取索引节点,再排序,经过所有索引节点

3.range:查询时,能根据索引做出一个范围的扫描

例:explain select id,name from table where id>25 \G

4.ref:通过索引列,可以直接引用到某些数据行

例:explain select id,name from table where id=10 \G

5.eq_ref:通过索引列直接引用某一行数据(常见于连接查询中)

例:explain select goods_id,shop_price from goods innert join ecs_catego ry using(cat_id) where goods_id> 25 \G

6.const,system,null:这3个分别指查询优化到常量级别,几乎不需要查找时间

例1:explain select id,name from table wher eid=10 \G

例2:explain select 1+2 \G

注:一般按照主键来查询时,易出现const,system ,而直接查询某个表达式或者不经过表时,会出现NULL

7.index_merge:MySQL 5.0 和之后的版本推出了一个新特性---索引合并优化(Index merge optimization),它让MySQL可以在查询中对一个表使用多个索引,对它们同时扫描,并且合并结果。

例1:explain select * from table where id = 1 or uid = 10 \G

例2:explainselect*fromtablewhere (id= 1 or id = 2) oruid= 3 \G

八、ref(连接查询表之间的字段引用关系):

例:explain select goods_id,cat_name,goods_name from  goods inner join ec_category using(cat_id) where ecs_category.cat_name='' \G

九、rows(估计扫描总行数)

十、extra(额外参数):

1.index:是指用到了索引覆盖,效率非常高

2.using where:是指光靠索引定位不了,还得where判断

3.using temporary:是指用上了临时表,group by 与order by 不同列时,或者group by ,order by 别的表的列

4.using filesort:文件排序(文件可能在磁盘,也可能在内存)

例:select sum(shop_price) from  goods group by cat_id;

注:这句sql用到了临时表和文件排序

你可能感兴趣的:(Mysql的explain语句)