8.2.1.9 LEFT JOIN and RIGHT JOIN Optimization 左连接和右连接优化:

SQL> select * from t1 join t2 on t1.id=t2.id;

ID NAME           ID NAME

 5 e               5 a5
1 a 1 a1
2 b 2 a2
3 c 3 a3
4 d 4 a4


左连接 左表全部显示:

SQL> select * from t1 left join t2 on t1.id=t2.id;

ID NAME           ID NAME

 5 e               5 a5
1 a 1 a1
2 b 2 a2
3 c 3 a3
4 d 4 a4
6 f


6 rows selected.

SQL> select * from t1 ,t2 where t1.id=t2.id(+);

ID NAME           ID NAME

 5 e               5 a5
1 a 1 a1
2 b 2 a2
3 c 3 a3
4 d 4 a4
6 f


6 rows selected.

6 rows selected.

(+) 指向对端

SQL> select * from t1 right join t2 on t1.id=t2.id;

ID NAME           ID NAME

 1 a               1 a1
2 b 2 a2
3 c 3 a3
4 d 4 a4
5 e 5 a5
7 a7


6 rows selected.

右边表全部显示

左连接 左表全部显示,右连接右表全部显示

MySQL 实现一个A LEFT JOIN B 关联条件如下:

表B 设置为依赖A表

表A 是设置依赖所有表(除了B) ,用于LEFT JOIN 条件

LEFT JOIN 条件是用于确定如何检索记录从B表(换句话说,任何条件在where条件不被使用)

所有的标准连接优化被执行, 一个表总是在所有表(它依赖的)后读取,如果有一个循环问题, MySQL 发出错误:

所有的标准WHERE 优化被执行

如果有一个行在A表,匹配了WHERE 子句, 但是在B表里通过关联列没有匹配的记录,一个额外的B表的记录设置为NULL

如果你设置LEFT JOIN

如果你使用LEFT JOIN 来找到那些不存在相同的表,你有如下测试: col_name IS NULL 在where 部分,

在col_name 是定义为NOT NULL列, MySQL 停止寻找更多的行(对于一个特定的key 组合),在它发现一条记录在匹配了LEFT JOIN 条件。

启用 RIGHT JOIN 是相似的和LEFT JOIN 相反:

join 优化 计算表被关联的顺序,表读取顺序强制通过LEFT JOIN 或者直接关联帮助join 优化器工作的更快。

因为有更少的表排列 需要检查, 注意这意味着 如果你做一个下面类型的查询,MySQL 做全表扫描B 因为LEFT JOIN 强制它在d前读取:

SELECT *

FROM a JOIN b LEFT JOIN c ON (c.key=a.key)

LEFT JOIN d ON (d.key=a.key)

WHERE b.key=d.key;

解决这个问题是颠倒顺序:

SELECT *

FROM b JOIN a LEFT JOIN c ON (c.key=a.key)

LEFT JOIN d ON (d.key=a.key)

WHERE b.key=d.key;

对于一个左连接,如果WHERE 条件始终是false 来产生NULL 行, LEFT JOIN 会改为一个normal join,

比如, 在WHERE 子句 在下面的查询 如果t2.colume1 是NULL

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