MySQL EXPLAIN结果中id列的含义及执行顺序对应规则是什么?
MySQL EXPLAIN执行结果中
id列的含义与执行规则 MySQL官方对id列的定义如下:
SELECT标识符,是查询内各个SELECT的顺序编号。若该行指代其他行的联合结果,该值可以为NULL,此时table列会显示
<unionM,N>类的值,表示该行对应id值为M和N的行的联合结果。
常见疑问解答
1. 顺序编号的值是否能反映查询计划步骤的执行顺序?是否编号越大执行时间越早?
绝大多数场景下,id值越大,对应的执行步骤优先级越高,执行时间越早。
可以结合你给出的示例验证:示例中id最大为7,对应sakila.store表的子查询,该子查询嵌套在der_2的派生表逻辑中,MySQL需要先拿到这个子查询的结果,才能执行id=6的派生表查询(查sakila.film表生成der_2);之后依次执行id=5的不可缓存子查询、id=3的派生表查询(查sakila.actor生成der_1);id=2的依赖子查询虽然id比外层的1大,但因为依赖der_1的actor_id字段值,所以会等der_1生成后再循环执行;最后执行id=1的主查询和id=4的UNION查询,id为NULL的步骤最终合并两者的结果返回。
2. 若两个步骤的编号值相同,MySQL会优先执行哪一个步骤?
如果多个执行步骤的id值完全一致,MySQL会按照EXPLAIN结果输出的从上到下的顺序依次执行,排在上方的步骤优先级更高。
示例参考
你提供的测试查询语句:
EXPLAIN SELECT actor_id, (SELECT 1 FROM sakila.film_actor WHERE film_actor.actor_id = der_1.actor_id LIMIT 1) FROM ( SELECT actor_id FROM sakila.actor LIMIT 5 ) AS der_1 UNION ALL SELECT film_id, (SELECT @var1 FROM sakila.rental LIMIT 1) FROM ( SELECT film_id, (SELECT 1 FROM sakila.store LIMIT 1) FROM sakila.film LIMIT 5 ) AS der_2;
对应的EXPLAIN核心结果:
+------+----------------------+------------+... | id | select_type | table |... +------+----------------------+------------+... | 1 | PRIMARY | <derived3> |... | 3 | DERIVED | actor |... | 2 | DEPENDENT SUBQUERY | film_actor |... | 4 | UNION | <derived6> |... | 6 | DERIVED | film |... | 7 | SUBQUERY | store |... | 5 | UNCACHEABLE SUBQUERY | rental |... | NULL | UNION RESULT | <union1,4> |... +------+----------------------+------------+...
内容的提问来源于stack exchange,提问作者fish
相关产品推荐
相关产品推荐

