3. Block Nested-Loop Join(块嵌套循环连接)
如果存在索引,那么会使用Index的方式进行Join,如果Join的列没有索引,被驱动表要扫描的次数太多了。每次访问被驱动表,其表中的记录都会被加载到内存中,然后再从驱动表中取一条与其匹配,匹配结束后清除内存,然后再从驱动表中加载一条记录,再把被驱动表的记录加载到内存匹配,这样周而复始,大大增加了IO次数。为了减少被驱动表的IO次数,就出现了Block Nested-Loop Join的方式。
Block Nested-Loop Join方式不再是逐条获取驱动表的数据,而是一块一块的获取,引入了 join buffer 缓冲区,将驱动表 join 相关的部分数据列(大小受 join buffer 的限制)缓冲到 join buffer 中,然后全表扫描被驱动表,被驱动表的每一条记录一次性和 join buffer 中的所有驱动表记录进行匹配(内存中操作),将简单嵌套循环中的多次比较合并成一次,降低了被驱动表的访问频率。
这是我在CS.DN上博客看到的关于JOIN原理的文章截段
每次匹配都需要扫描内表加载到内存中,但是为什么要多一个清除内存的操作?
这样 扫描-清除 反复操作,不是徒增I/O次数吗。