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

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itas109

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值