11.MySQL优化Outer Join Optimization

介绍

Outer joins包含LEFT JOIN和RIGHT JOIN.

MySQL实现了一个A LEFT JOIN B join_condition,如下所示:

  • 表B设置为依赖于表A和A所依赖的所有表。
  • 表A设置为依赖于LEFT JOIN条件中使用的所有表(B除外)。
  • LEFT JOIN条件用于决定如何从表B中检索行。(换句话说,不使用WHERE子句中的任何条件。)
  • 执行所有标准连接优化,但始终在所依赖的所有表之后读取表。 如果存在循环依赖关系,则会发生错误。
  • 执行所有标准WHERE优化。
  • 如果A中有一行与WHERE子句匹配,但B中没有与ON条件匹配的行,则会生成一个额外的B行,并将所有列设置为NULL。
  • 如果使用左联接查找某些表中不存在的行,则进行以下测试:在Where条件里设置col_name is null,在表定义中col_name定义这列is not null,MySQL在找到与LEFT JOIN条件匹配的行后停止搜索更多行(对于特定的键组合)。

RIGHT JOIN实现类似于LEFT JOIN的实现,表格角色颠倒过来。

对于LEFT JOIN,如果生成的空行的WHERE条件总是false,则将LEFT JOIN更改为inner join。则将左连接更改为内部联接。例如,如果t2.column1为NULL,则WHERE子句在以下查询中将为false:

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

因此,将查询转换为inner join是安全的:

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

现在优化器可以在表t1之前使用表t2,如果这样做会导致更好的查询计划。

猜你喜欢

转载自blog.csdn.net/ciqingloveless/article/details/83655921