【发布时间】:2021-12-02 00:53:31
【问题描述】:
假设一个查询:
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;
它给出了以下 8 个步骤(行)的查询计划:
+------+----------------------+------------+...
| 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> |...
+------+----------------------+------------+...
官方文档定义了id列:
SELECT 标识符。这是查询中 SELECT 的序号。如果该行引用其他行的联合结果,则该值可以为 NULL。在这种情况下,表格列显示类似
的值,表示该行是指 id 值为 M 和 N 的行的并集。
根据文档,id就是序号(sn为了简洁),这个sn有什么隐喻吗?
- sn 值是否反映了查询计划步骤的执行顺序? sn越大,执行顺序越早?
- 如果两步的sn值相同,mysql先运行哪一步?
【问题讨论】:
-
不就是查询文本中的顺序,与执行顺序无关吗?这就是我阅读文档的方式
-
是的,但我读了很多博客文章说
the sn value reflects the execution order.like this one