4.7 外部连接优化
外部连接包括LEFT JOIN
和 RIGHT JOIN
。
MySQL实现如下: *
A* LEFT JOIN *
B* *
join_specification*
表*
B
被设置为依赖于表A
*以及所依赖的所有表A
。表格*
A
被设置为取决于条件B
*中使用的所有表格(除外)LEFT JOIN
。该
LEFT JOIN
条件用于确定如何从table中检索行B
。(换句话说,WHERE
不使用该子句中的任何条件。)执行所有标准的连接优化,不同之处在于始终在表所依赖的所有表之后读取该表。如果存在循环依赖关系,则会发生错误。
WHERE
执行 所有标准优化。如果一行中*
A
有匹配该WHERE
子句的行,但其中没有一行B
*与ON
条件匹配的行,则将 *B
*生成一个额外的 行,并将所有列都设置为NULL
。如果
LEFT JOIN
用于查找某张表中不存在的行,并且进行了以下测试:*
col_name* IS NULL
在该WHERE
部分中,*col_name
*声明为的列在哪里NOT NULL
,MySQL在找到后停止搜索更多行(针对特定的键组合)符合LEFT JOIN
条件的一行。
该RIGHT JOIN
实现类似于LEFT JOIN
表角色相反的实现。将右连接转换为等效的左连接。
对于LEFT JOIN
,如果 WHERE
条件对于生成的NULL
行始终为false ,则将LEFT JOIN
其更改为内部连接。例如, WHERE
如果条款是在下面的查询错误的t2.column1
是 NULL
:
因此,将查询转换为内部连接是安全的:
现在,如果这样做会导致更好的查询计划,那么优化器可以先使用表,t2
然后使用表t1
。要提供有关表连接顺序的提示,请使用STRAIGHT_JOIN
;。但是,STRAIGHT_JOIN
由于它禁用了半连接转换,因此 可能会阻止使用索引。
Last updated