[英]Order of execution in MySQL query with multiple JOINS of subqueries
我有以下查询,前两个子查询e
和a
之间有一个LEFT JOIN
,最后两个子查询a
和m
之间有一个INNER JOIN
:
SELECT {cols}
FROM
(SELECT {cols}
FROM {table}
WHERE {conditions}) AS e
LEFT JOIN
(SELECT {cols}
FROM {table}
WHERE {conditions}) AS a
ON e.col = a.col
INNER JOIN
(SELECT {cols}
FROM {table}
WHERE {conditions}) AS m
ON e.col = m.col
当我将第二个连接从INNER JOIN
更改为LEFT JOIN
时,执行时间增加了~200
倍。 每个子查询的记录数如下:
e -> Number of records: 303
a -> Number of records: 18
m -> Number of recordings: 295
我假设 MySQL 会将每个子查询评估为一个独立的子查询,然后执行连接,在这种情况下,从INNER JOIN
到LEFT JOIN
的更改不应导致执行时间增加,因为记录数量相对较少,如上所示.
因此,显然这似乎不是遵循的执行顺序。
解释计划:
Case 1 with INNER JOIN: join e with m first, then join with a.
Case 2 with LEFT JOIN: join e with a first, then join with m.
我不确定为什么这两个计划在这两种情况下不同,以及这如何导致执行时间不同。
谁能帮我解释一下实际的执行顺序是什么?
连接顺序由查询计划器决定,以在它认为合适时进行优化。 有时它会弄错。 如果您认为加入顺序不是最优的,您可以通过指定SELECT STRAIGHT_JOIN
而不是SELECT
来强制执行。 这将强制查询规划器按照查询中列出的顺序连接表。
外连接总是会变慢,因为它们必须扫描更多的行——它们不能丢弃两边都不匹配的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.