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;