標籤:
Block Nested-Loop and Batched Key Access Joins
Batched Key Access (BKA) Join演算法通過index和join buffer訪問joined表,BKA演算法支援inner join,outer join 和semi join操作,包括嵌套的outer join,BKA的好處包括提高join效能(由於更有效率的table scan),同時,前文的Block Nested loop(BNL)join 演算法被擴充也支援這些join類型。
Block Nested-Loop
MYSQL server提供了join buffer來執行沒有index的內連結,外串連,半串連的內表訪問子查詢,並且當通過index來訪問內表是join buffer更有效率。
當儲存“感興趣的行列值”時,join buffer管理器更有效率的利用join buffer空間,如果行列值為null,join buffer 不會為之分配空間,並且最小化分配空間給varchar類型的資料;
管理器支援兩種類型的buffer,常規的和增量式的,e.g.join buffer b1 應用在表t1和表t2的join,該join結果和表t3用b2做Join;
1:常規的join buffer包含每個join運算元(table)的列,如果b2是一個常規的join buffer, join buffer b1中的每一行和 table t2相對應匹配行的組成的新行資料(包含t2剛興趣的列)全部被壓入b2之中;
2:增量式 join buffer 只包含做join操作的內表中的資料行,因此,它作為第一個join buffer 的行的增量。如果b2是一個增量式的join buffer ,它包含內表剛興趣的行列資料和 join
buffer b1對應行資料的一個引用;
增量式 join buffers總是關於前面一個join操作的join buffer的相關增量,所以前面一個join 操作的join buffer往往是 常規 join buffer;join buffer b1用於table t1 和t2串連,其必須為常規join buffer;
增量式join buffer 僅僅包含joined table(內表)的剛興趣的列,這些列被指定一個前一個join操作產生的table的行引用(也僅含有感興趣的列),增量式join buffer中的一些資料行引用那些儲存在前一個join buffer中的同一行資料(match success的);
增量式join buffer保證小頻率的從前一個join buffer中copy 資料,這節省了join buffer的空間,因為在一般情況下,前一個join操作產生的行可能被該join操作的joined table的多行資料匹配,沒必要多次拷貝前一個join buffer的同一行資料,同時也減少處理時間。
Batched Key Access Join
當通過index來訪問做join操作的joined table時,批量key訪問串連被使用,和BNL演算法一樣,BKA join演算法應用join buffer來存放join操作第一個表中感興趣的行列值,
然後BKA演算法為join buffer中的所有行建立index來訪問second table,並且批量的提交這些indexes 給資料庫引擎來尋找這些index,這些index通過MRR(mutil range read)介面提交,
MRR引擎執行index尋找,擷取得到的資料,然後執行BKA匹配演算法獲得匹配行資料(refenece 前一JoinBufferd的行資料)
MySQL Block Nested Loop and Batched Key Access Joins(塊嵌套迴圈和批量Key訪問串連)