【问题标题】:What the meaning of the `id` column of the mysql query explain?mysql查询的`id`列的含义是什么解释?
【发布时间】: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

标签: mysql query-optimization


【解决方案1】:

像 MySQL 这样的数据库系统内置了非常精细的查询计划/优化模块。 EXPLAIN 揭示了一点优化的逻辑;特别是哪些索引是相关的。 EXPLAIN 不一定揭示服务器如何对其操作进行排序。

而且,SQL 是一种声明性语言。你用它来描述你想要什么,而不是如何得到它。。这使它与大多数其他过程式编程语言不同。您关于子查询执行顺序的问题是程序问题,而不是声明性问题。

子查询的执行顺序,以及它们的执行并发性,是一个实现细节,可能会随着数据库软件的发布而改变。

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2020-03-11
    • 2013-03-11
    • 1970-01-01
    • 2018-03-06
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多