⑤. type字段
①. 这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围
②. 依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询达到range级别,最好达到ref
③. NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可 以单独查找索引来完成,不需要在执行时访问表
mysql> explain select min(id) from film;
④. const、system:mysql能对查询的某部分进行优化并将其转化成一个常量(可以看show warnings 的结果)。用于primary key或unique key的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。system是const的特例,表里只有一条元组匹配时为system
mysql> explain extended select * from (select * from film where id = 1) tmp; show warnings;
⑤. eq_ref:primary key或 unique key索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在const之外最好的联接类型了,简单的select查询不会出现这种type
mysql> explain select * from film_actor left join film on film_actor.film_id = film.id;
⑥. ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
# 简单select查询,name是普通索引(非唯一索引) mysql> explain select * from film where name = 'film1'; # 关联表查询,idx_film_actor_id是film_id和actor_id的联合索引,这里使用到了film_actor的左边前缀film_id部分 mysql> explain select film_id from film left join film_actor on film.id = film_actor.fi lm_id;
⑦. range:范围扫描通常出现在in(),between,> ,<, >= 等操作中。使用一个索引来检索给定范围的行
mysql> explain select * from actor where id > 1;
⑧. index:扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些
为什么不走主键索引?这张表两个字段,主键索引和二级索引,mysql会优先使用二级索引进行查询,这是因为二级索引小(主键索引下面包括了所有的行信息),如果你二级索引下面的数据都能拿到,使用二级索引
mysql> explain select * from film;
⑨. ALL:即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了
mysql> explain select * from actor;