Block Nested-Loop Join

Block Nested-Loop Join

Content #

BNJ 是对 Simple Nested Loop Join 的一种优化,改进点就是减少 Inner 表的全表扫描次数。 BNJ的变化主要在于步骤 1,读取 Outer 表时不再只取一条记录,而是读取一个批次的 x 条记录,加载到内存中。这样执行一次 Inner 表的全表扫描就可以比较 x 条记录。

在 MySQL 中,这个 x 对应一个叫做 Join Buffer 的设置项,它直接影响了 BNJ 的执行效率。

与 SNLJ 相比,BNJ 虽然在时间复杂度都是 O(m*n)(m 和 n 分别是 Outer 表和 Inner 表的记录行数),但磁盘 I/O 的开销却明显降低了,所以效果优于 SNLJ。

Viewpoints #

From #

20 | 关联查询:如何提升多表Join能力?