MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization)
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
环境:
MySQL版本:5.5.15
操作系统:windows
本文讨论左Join 和右Join 优化(Left Join and Right Join Optimization)。
MySQL按如下方式实现A LEFT JOIN B:
- 表B被设置为依赖于表A和A所依赖的所有表。
- 表A被设置为依赖于在LEFT JOIN条件中使用的所有表(除了B)。
- LEFT JOIN条件用于决定如何从表B中检索行(换句话说,不使用WHERE子句中的任何条件)。
- 所有标准连接优化都执行,不同之处在于一个表总是在它所依赖的所有表之后被读取。 如果有循环依赖,则会发生错误。
- 所有标准的WHERE优化都被执行。
- 如果A中存在与WHERE子句匹配的行,但B中没有与ON条件相匹配的行,则会生成一个额外的B行,并将所有列设置为NULL。
- 如果使用LEFT JOIN查找某些表中不存在的行,并且您有以下测试:在WHERE部分中,col_name是NULL,其中col_name是一个声明为NOT NULL的列,MySQL将停止搜索更多行(为了找到一行符合LEFT JOIN条件的特定组合键)。
RIGHT JOIN实现类似于LEFT JOIN,其表格角色颠倒了。 右连接转换为等效的左连接
连接优化器计算连接表的顺序。 由LEFT JOIN或STRAIGHT_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;
在这种情况下,修复与在FROM子句中列出a和b的顺序相反:
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;
对于LEFT JOIN,如果WHERE条件对于生成的NULL行始终为false,则将LEFT JOIN更改为正常连接。 例如,如果t2.column1为NULL,则WHERE子句在以下查询中将为false:
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;
现在优化器可以在表t1之前使用表t2,如果这样做会导致更好的查询计划。 要提供有关表连接顺序的提示,请使用STRAIGHT_JOIN
Reference:
https://dev.mysql.com/doc/refman/5.5/en/left-join-optimization.html
觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033