https://www.cnblogs.com/xiaoboluo768/p/5400990.html
http://blog.51cto.com/lijianjun/1881208
id:查询序号
select_type:查询类型
table:查询针对的表
有可能是
实际的表名 如select * from t1;
表的别名 如select * from t1 as tmp;
derived 如from型子查询时
null 直接计算得结果,不用走表
possible_keys:可能用到的索引
注意:系统估计可能用到的几个索引,但最终只能用一个
key:最终用的索引
key_len:使用的索引的最大长度
注:有可能possible_keys为null,而key不为null这种情况
possible_keys分析的是索引用于查找的过程
而最终的key可能是被用于查找,排序或索引覆盖
例:http://www.zixue.it/thread-11966-1-1.html
type:
较为重要的一个指标,从好到差依次是:system > const > eq_ref > ref > fulltext >ref_or_null > index_merge > unique_subquery > index_subquery >range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref
1) all:全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录
2) index:索引全表扫描,把索引从头到尾扫一遍
两种情况会出现
1.索引覆盖的情况下,能利用上索引数据,但利用不上索引查找,必须全索引扫描例:explain select c3 from t3 where c1+2=1 \G index(c1, c2, c3)
2.是利用索引来进行排序,但取出所有节点
select goos_id from goods order by goods_id desc;
分析:没有加where条件,就得取所有索引节点,同时又没有回行,只取索引节点再排序,经过所有索引节点
3)range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询
4)index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重
5)unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值
6)index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引
7)ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多
8)fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引
9) ref 非唯一性索引扫描或者,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找
10) eq_ref 出现在要连接过个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref
11) const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描
12) system:表中只有一行数据或者是空表,且只能用于myisam和memory表。如果是Innodb引擎表,type列在这个情况通常都是all或者index
rows:执行计划中估算的扫描行数,不是精确值
ref:指连接查询时,表之间的字段引用关系
Extra:
index:是指用到了索引覆盖,效率非常高
using where 是指光靠索引定位不了,还得where判断一下
using temporary 是指用上了临时表,group by与order by不同列时,或group by,order by别的表的列
using filesort:文件排序(文件可能在磁盘,也可能在内存)
注:如果取出的列,含有text或者更大的如mediumtext等,filesort将会发生在磁盘上
from型子查询:
注意:内存from查到的临时表是没有索引的
所以:from的返回内容要尽量少,需要排序在内层先排好序
union优化
union总是要产生临时表,对union的优化比较棘手。union all不需要去重复,union去重就需要排序