繁体   English   中英

具有多个 JOINS 子查询的 MySQL 查询中的执行顺序

[英]Order of execution in MySQL query with multiple JOINS of subqueries

我有以下查询,前两个子查询ea之间有一个LEFT JOIN ,最后两个子查询am之间有一个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 JOINLEFT 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM