关于Mysql的join连接算法Block Nested-Loop Join算法是如何实现优化的?

以这篇博文为例
https://blog.csdn.net/wanbin6...

BNL算法原理:将外层循环的行/结果集存入join buffer,内存循环的每一行数据与整个buffer中的记录做比较,可以减少内层循环的扫描次数

举个简单的例子:外层循环结果集有1000行数据,使用NLJ算法需要扫描内层表1000次,但如果使用BNL算法,则先取出外层表结果集的100行存放到join buffer, 然后用内层表的每一行数据去和这100行结果集做比较,可以一次性与100行数据进行比较,这样内层表其实只需要循环1000/100=10次,减少了9/10。

======================
问题: joinbuffer中有10行数据,内层表的每一行与join_buufer中的数据做比较。比较此时是10*内层表的行数。
什么是“可以一次性与100行数据进行比较”

阅读 2.5k
1 个回答

Simple Nested-Loop Join算法的缺点是对于内表的扫描次数太多,从而导致扫描的记录太过庞大。Block Nested-Loop Join算法较Simple Nested-Loop Join的改进就在于可以减少内表的扫描次数,甚至可以和Hash Join算法一样,仅需扫描内表一次。
Join Buffer会缓存所有参与查询的列而不是只有Join的列。
可以一次性与100行数据进行比较意思是可以批量比较。
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题