首页 » MySQL » MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optim

MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optim

原文 http://blog.csdn.net/itas109/article/details/79153201

2018-01-25 02:01:21阅读(585)

MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization)

如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:12951803

环境:
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

觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optim
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:12951803

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹