5)UNION:在 UNION 查询语句中的第二个和紧随其后的 SELECT。
6)UNION RESULT:MySQL选择使用临时表完成 UNION 查询的去重工作。
当 select_type 为这个值时,经常可以看到table的值是 <unionN,M>,这说明匹配的 id 行 是这个集合的一部分。请看上面 UNION 查询示例。
7)MATERIALIZED:当查询优化器执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询时,该子查询类型为 MATERIALIZED。
8)DEPENDENT SUBQUERY:包含的子查询语句无法转换为 semi-join,并且为相关子查询,则该子查询的第一个 SELECT 就会 DEPENDENT SUBQUERY。该查询可能会被执行多次。
8)DEPENDENT UNION:包含的子查询语句中包含了 UNION 或者 UNION ALL 的大查询,这些查询都依赖外层查询,这些子查询语句类型为 DEPENDENT UNION。
EXPLAIN SELECT * FROM user WHERE id IN (SELECT user_id FROM user_group WHERE name = 'a' UNION SELECT id FROM user WHERE name = 'b');上面这个子查询语句中的 SELECT user_id FROM user_group WHERE name = 'a' 这个小查询是第一个子查询,所以它的 select_type 为 DEPENDENT SUBQUERY,而 SELECT id FROM user WHERE name = 'b' 这个查询在 UNION 后面,所以它的 select_type 为 DEPENDENT UNION。
最常见的值包括:SIMPLE 、PRIMARY、DERIVED、UNION。
3、table 列
table 列表示 EXPLAIN 的单独行的唯一标识符。这个值可能是表名、表的别名或者一个未查询产生临时表的标识符,如派生表、子查询或集合。
当 FROM 子句中有子查询时,如果优化器采用的物化方式,table 列是 <derivenN> 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。
当使用 UNION 查询时,UNION RESULT 的 table 列的值为 <UNION1,2>,1和2表示参与 UNION 的 SELECT 的行 id。
4、type 列
这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询达到range级别,最好达到ref
NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表。
1)system,const:MySQL 能对查询的某部分进行优化并将其转化成一个常量。用于主键或唯一二级索引列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。system是 const 的特例,表里只有一条记录匹配时为 system。
EXPLAIN SELECT * FROM (SELECT * FROM user where id = 1) tmp;
2)eq_ref:在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的,则对该被驱动表的访问方法就是 eq_ref。这可能是在 const 之外最好的联接类型了。
EXPLAIN SELECT * FROM user_group INNER JOIN user ON user_group.user_id = user.id;
3)ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
a. 简单 SELECT 查询,name 是普通索引(非唯一索引)。
EXPLAIN SELECT * FROM user where user.name = 'a';
b. 关联表查询,idx_user_group_id (user_id,group_id) 为联合索引,这里使用到了user_group联合索引最左边前缀 user_id。
EXPLAIN SELECT user_id FROM user LEFT JOIN user_group ON user.id = user_group.user_id;