Nested Loop Join (NLJ)算法:
NLJ,顾名思义,是指嵌套循环算法,my.oschina.net 上面有一段代码对NLJ做出了说明:
for each row in t1 matching range { //外层循环
for each row in t2 matching reference key { //次内层循环
for each row in t3 { //最内层循环
if row satisfies join conditions, //进行条件匹配,若满足,发给client
send to client
}
}
}
即,将驱动表/外部表的结果集作为循环基础数据,然后循环从该结果集每次一条获取数据作为下一个表的过滤条件查询数据,然后合并结果。如果有多表join,则将前面的表的结果集作为循环数据,取到每行再到联接的下一个表中循环匹配,获取结果集返回给客户端。
(此处仅对两层循环分析,多层循环可以将最内层循环看作一层,将其余的看作一层进行分析)
我以为,可以将内层表看作被驱动表,外层表看作驱动表。每次join时,从驱动表中先拿出一条数据和被驱动表进行条件匹配,若匹配成功,则将数据连接后放入结果集。接着,外层的驱动表扫描获取第二条记录,并和被驱动表进行条件匹配,将成功的记录连接后放入结果集,剩余数据以此类推。最后,将结果集发给请求的客户端。
并且,