将被转换为:
注:因为设置了条件t2.column2 = 5,那么对于所有的生成的t2为null的行都是不成立的
这样的优化将非常快速,因为这样相当于把外连接转换为等值连接,少了很多行的扫描和判断。
嵌套循环JOIN算法----Nested-Loop Join
简单的嵌套循环算法就是从一个表开始,通过对表的条件找到一行,然后找下一个表的数据,找完后,又回到第一个表来寻找满足条件的行
例如,有三个表t1, t2, t3,他们的join类型为:
最终生成的伪代码为
即,t1表通过范围扫描,t2关联t1,t3为全表扫描
注:先根据对t1表的条件范围找到一行,和t2匹配,然后寻找t3的满足条件的行
块嵌套循环JOIN算法 ---- Block Nested-Loop Join
这个算法的应用为:由于之前的嵌套算法每读一个表的一行后,就会读下表,这样内部的表会被读很多次,所以,数据库利用了join缓存(join buffer)来存储中间的结果,然后读取内部表的时候,找到一行,都和这个缓存中的数据比较,以此来提高效率。例如:一次从外表读10行,然后读内部表时,都和这10行数据进行比较。
MySQL使用join buffer的条件为:
1、join_buffer_size系统变量决定了每个join使用的buffer大小
2、join类型为index或all时,join buffer才能被使用
3、每一个join都会分配一个join buffer,即一个sql可能使用多个join buffer
4、join buffer 不会分配给第一个非常量表
5、只有需要引用的列会被放到join buffer中,不是整行
最终生成伪代码为:
注:在第二个循环才把数据存在join buffer中,这正好印证了上面的第4点