(3) type: 索引类型、类型
- system>const>eq_ref>ref>range>index>all
其中:system,const只是理想情况;实际能达到ref>range
system: 只有一条数据的系统表;或衍生表只有一条数据的主查询
const:仅仅能查到一条数据的SQL,用于Primary key或者unique索引
rq_ref:唯一性索引,对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多、不能0)
例如:select…from …where name=… 其中name必须为索引且唯一。
ref: 非唯一性索引,对于每个索引键的拆线,返回匹配的所有行(0,多)
range: 检索指定范围的行,where后面是一个范围查询(between, >, <…)
注意:in有时候会失效,从而转为无索引。
index:查询全部索引中数据
all:查询所有表中数据
(4)possible_keys:可能用到的索引,是一种预测,不准。
(5)key:实际使用到的索引
(6)key_len: 索引的长度;
- 作用:用于判断复合索引是否被完全使用(a,b,c)。
(7)ref: 注意与type中的ref值区分。
- 作用:指明当前表所参照的字段
(8)rows: 被索引优化查询的数据个数(通过索引查到的数据个数)
(9)Extra:
- using filesort : 性能消耗大;需要额外一次查询
例如:explain select * from test where a1=‘’ order by a2; --using filesort小结:1. 对于单索引,如果排序和查找是同一个字段,则不会出现using filesort;如果排序和查找不是同一个字端,则会出现。
避免:where哪些字段,就order by 那些字段2. 对于复合索引,如果排序和查找的使用顺序是一致的(跨列部分索引失效,因此不算),则不会出现using filesort, 反之则会。
复合索引:不能跨列(最佳左前缀)
避免:where和order by按照复合索引的顺序使用,不要跨列或无序使用。 - using temporary :性能损耗大,用到了临时表,一般出现在group by语句中。
例如:explain select * from tests03 where a2 = 2 and a4=4 group by a3
避免:查询哪些列,就根据哪些列group by. - using index :性能提升;索引覆盖(覆盖索引)。只要查询的列全为索引,即可达成索引覆盖。
- using where :需要回表查询。
假设age为索引
例如:explain select age, name from test03 where age = a2; - impossible where: where子句永远为false.