id列
id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按照select出现的顺序增长的,id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行
select_type
表示对应行是简单还是复杂的查询。
simple: 简单查询,查询不包含子查询和union ;
primary: 复杂查询中最外层的select ;
subquery: 包含在select中的子查询(不在from子句中);
derived: 包含在from子句中的子查询.MySQL会将结果存放在一个临时表中,也称为派生表 ;
union: 在union中的第二个和随和的select;
table
这一列表示explain的一行正在访问哪个表,当from子句中有子查询时格式,标识当前查询依赖id=N的查询,于是限制性id=N的查询.当有union时,union result的table列的值为<union1,2>,1和2表示参与union的select行id
type
这一列标识关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围.依次从最好到最差分别为: system > const > eq_ref > ref > range > index > all。
一般来说,得保证达到range级别,最好达到ref。Null: MySQL能在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如: 在索引中选取最小值,可以单独查找索引来完成,不需要在执行时访问表。
const,system: MySQL能对查询的某部分进行优化并且将其转化为一个常量。用于primary key 或者 unique key 的所有列与常数比较时,所以表最多一个匹配行,读取一次,速度比较快。
system是const的特例,表里只有一条元组匹配时为system。
eq_ref: primary key 或 unique key索引的所有部分被连接使用,最多只会返回一条符合条件的记录。这可能是在const之外最好的连接类型了,简单的select查询不会出现这个type。
ref: 相比eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
range: 范围扫描通常出现在in(),between,>=<等操作中,使用一个索引给定范围的行。
index: 扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以通常比All快一些。
possible_keys
这一列显示查询可能使用哪些索引来查找。
explain时可能出现possible_keys有列,而key显示NULL的情况,这种情况是因为表中数据不多,MySQL认为索引对此查询帮助不大,选择了全表查询。
如果该列是NULL,则没有相关的索引,在这种情况下,可以通过检查where子句看是否可以创造一个适当的索引来提高查询性能,然后用explain查看效果。
key
这一列显示MySQL实际采用哪个索引来优化该表的访问。如果没有使用索引,则该列是NULL,如果想强制MySQL使用或护士possible_keys列中的索引,在查询中使用force,ndex,ignore index.
ken_len
这一列显示了MySQL在索引里使用的字节数,通过这个值可以算出具体使用了索引的哪些列。
ref
这一列显示了再key列记录的索引中,表查找值所用到的列和常量,常见的有: const,字段名
rows
这一列是MySQL估计尧都区并检测的行数,注意这个不是结果集里的行数
Extra
这一列展示的是额外信息
索引总结