一、EXPLAIN执行计划详解
字段说明
1.id
id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的。如果出现多表关联的情况,id = 1的表是驱动表。没有id的,代表中间的计算结果。
2.select_type
select_type是指查询类型,说明查询的种类。
2.1 simple简单查询
simple简单查询,查询不包含子查询和union。
explain select * from award where id = 2;
2.2 复杂查询
对于复杂查询通常包含多种select_type。
explain select (select 1 from award where id = 1)
from
(select * from strategy_award where id = 1
union
select * from strategy_award where id = 1) der;
#查询执行流程
#执行派生表查询:
#从 strategy_award 表中查找 id = 1 的记录,两次。
#使用 UNION 合并结果,生成临时表 der。
#如果 id = 1 的记录存在,der 中会有一条记录;否则为空。
#执行最外层查询:
#对 der 中的每一行(最多一行),执行标量子查询 (SELECT 1 FROM award WHERE id = 1)。
#如果 award 表中存在 id = 1 的记录,返回 1;否则返回 NULL。
#返回结果:
#如果 der 中有记录,返回子查询的结果(1 或 NULL)。如果 der 为空,则整个查询结果为空。
primary:复杂查询中最外层的select,derived:包含在from字句中的子查询。Mysql会将结果存放到一个临时表中,也称为派生表(derived的英文含义),union指定在union之后的第一个select,union result表示从union临时表检索结果的select,会产生临时表(没有索引)(union all 不进行去重)。subquery指包含在select中的子查询。
2.3 各项详解
值 | 含义 |
SIMPLE | 不包含子查询或者UNION操作的查询(简单查询) |
PRIMARY | 复杂查询中最外层的select,看到primary通常代表一个嵌套查询 |