MySQL查询优化之七-左Join和右Join优化(LeftJoinandRightJoi。。。MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization)
环境:
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)
多表left joinWHERE 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) lumn2=5;
因此,将查询转换为正常联接是安全的:
SELECT * FROM t1, t2 lumn2=lumn1;
现在优化器可以在表t1之前使⽤表t2,如果这样做会导致更好的查询计划。 要提供有关表连接顺序的提⽰,请使⽤STRAIGHT_JOIN
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论