You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:24:00