Nested Loop Join(NLJ)算法:
首先介绍一种基础算法:NLJ,嵌套循环算法。循环外层是驱动表,循坏内层是被驱动表。驱动表会驱动被驱动表进行链接操做。首先驱动表找到第一条记录,而后从头扫描被驱动表,逐一查找与驱动表第一条记录匹配的记录而后链接起来造成结果表中的一条记。被驱动表查找完后,再从驱动表中取出第二个记录,而后从头扫描被驱动表,逐一查找与驱动表第二条记录匹配的记录,链接起来造成结果表中的一条记录。重复上述操做,直到驱动表的所有记录都处理完毕为止。这就是嵌套循环链接算法的基本思想,伪代码以下。算法
foreach row1 from t1 foreach row2 from t2 if row2 match row1 //row2与row1匹配,知足链接条件 join row1 and row2 into result //链接row1和row2加入结果集
首先加载t1,而后从t1中取出第一条记录,以后加载t2表,与t2表中的记录逐个匹配,链接匹配的记录。缓存
Block Nested Loop Join(BNLJ)算法:
再介绍一种高级算法:BNLJ,块嵌套循环算法,能够看做对NLJ的优化。大体思想就是创建一个缓存区,一次从驱动表中取多条记录,而后扫描被驱动表,被驱动表的每一条记录都尝试与缓冲区中的多条记录匹配,若是匹配则链接并加入结果集。缓冲区越大,驱动表一次取出的记录就越多。这个算法的优化思路就是减小内循环的次数从而提升表链接效率。oop
1.内循环的次数:如今考虑这么一个场景,当t1有100条记录,t2有10000条记录。那么,t1驱动t2与t2驱动t1,他们之间在效率上孰优孰劣?若是是单纯的分析指令执行次数,他们都是100*10000,可是考虑到加载表的次数呢。首先分析t1驱动t2,t1表加载1次,t2表须要加载100次。而后分析t2驱动t1,t2表首先加载1次,可是t1表要加载10000次。因此,t1驱动t2的效率要优于t2驱动t1的效率。由此得出,小表驱动大表可以减小内循环的次数从而提升链接效率。
另外,若是使用Block Nested Loop Join算法的话,经过扩大一次缓存区的大小也能减少内循环的次数。由此又可得,设置合理的缓冲区大小可以提升链接效率性能
2.快速匹配:扫描被驱动表寻找合适的记录能够看作一个查询操做,如何提升查询的效率呢?建索引啊!由此还可得出,在被驱动表创建索引可以提升链接效率优化
3.排序:假设t1表驱动t2表进行链接操做,链接条件是t1.id=t2.id,并且要求查询结果对id排序。如今有两种选择,方式一[...ORDER BY t1.id],方式二[...ORDER BY t2.id]。若是咱们使用方式一的话,能够先对t1进行排序而后执行表链接算法,若是咱们使用方式二的话,只能在执行表链接算法后,对结果集进行排序(Using temporary),效率天然低下。由此最后可得出,优先选择驱动表的属性进行排序可以提升链接效率。spa