Skip to content

Latest commit

 

History

History
30 lines (20 loc) · 1.92 KB

外部连接优化.md

File metadata and controls

30 lines (20 loc) · 1.92 KB

4.7 外部连接优化

外部连接包括LEFT JOINRIGHT 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.column1NULL

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

因此,将查询转换为内部连接是安全的:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

现在,如果这样做会导致更好的查询计划,那么优化器可以先使用表,t2然后使用表t1。要提供有关表连接顺序的提示,请使用STRAIGHT_JOIN;。但是,STRAIGHT_JOIN由于它禁用了半连接转换,因此 可能会阻止使用索引。