一、id:
代表select语句的编号,如果是连接查询,表之间是平等关系,select 编号都是从1开始,如果某select中有子查询,则编号递增;
二、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用到了临时表和文件排序