Mysql巢狀迴圈連線演算法

2021-12-30 10:48:57 字數 1195 閱讀 8152

// 迴圈連線演算法分為兩種

1.巢狀迴圈連線演算法

2.塊巢狀迴圈連線演算法乙個簡單的巢狀迴圈連線(nlj)演算法從乙個迴圈中的第乙個表中讀取一行中的行,將每行傳遞給巢狀迴圈,以處理連線中的下乙個表。該過程重複多次,因為還有待連線的表。

假設三個表之間的連線 t1,t2以及 t3,那麼nlj演算法會這麼來執行:

// 規則

table join type

t1 range

t2 ref

t3 all

// 簡單的nlj執行演算法

for each row in t1 matching range

}}// nlj演算法的不足

nlj演算法一次將一行從外部迴圈傳遞到內部迴圈,所以通常會在內部迴圈中多次讀取表塊巢狀迴圈(bnl)連線演算法使用在外部迴圈中讀取的行的緩衝來減少內部迴圈中的表必須被讀取的次數。例如,如果將10行讀入緩衝區並將緩衝區傳遞到下乙個內迴圈,則可以將內迴圈中讀取的每行與緩衝區中的所有10行進行比較。這減少了內錶必須讀取次數的乙個數量級。

使用連線緩衝有如下特性:

當連線型別是all或者index的時候,可以使用連線緩衝 (換句話說,當沒有鍵(索引)可用的時候,對資料和索引各進行一次全掃瞄) range。緩衝的使用也適用於外連線 連線緩衝區從來不為第乙個常數表進行分配,即使它的型別是 all或 index。 只有有關系列儲存在其連線緩衝區中,而不是整行都放進去。 join_buffer_size 系統變數用於確定處理乙個查詢的每個連線的緩衝區的大小。 為每個可快取的連線分配乙個緩衝區,因此可以使用多個連線緩衝區處理給定的查詢。 在執行連線之前分配連線緩衝區,並在查詢完成後釋放。

// 使用快取的迴圈連線演算法

for each row in t1 matching range

}empty join buffer}}}

if buffer is not empty

}}如果s是每個儲存的大小

t1,t2組合是連線緩衝區,

c是緩衝區中的組合數,那麼t3掃瞄的次數是:

(s * c)/join_buffer_size + 1 次

// join_buffer_size 優化快取速度

增加 join_buffer_size 的值可以降低掃瞄t3的次數

降低的極限是當join_buffer_size大到足以容納所有上一行的組合資料,沒有比這個掃瞄速度更快的了。

Mysql演算法內部演算法 巢狀迴圈連線演算法

迴圈連線演算法分為兩種 1.巢狀迴圈連線演算法 2.塊巢狀迴圈連線演算法乙個簡單的巢狀迴圈連線 nlj 演算法從乙個迴圈中的第乙個表中讀取一行中的行,將每行傳遞給巢狀迴圈,以處理連線中的下乙個表。該過程重複多次,因為還有待連線的表。假設三個表之間的連線 t1,t2以及 t3,那麼nlj演算法會這麼來...

巢狀迴圈連線 Nested Loops Join

巢狀迴圈連線 nested loops join 是一種兩個表在做表連線時依靠兩層巢狀迴圈 分別為外層迴圈和記憶體迴圈 來得到連線結果集的表連線方法。即外層迴圈對應的驅動結果集有多少條記錄,遍歷被驅動表的內層迴圈就要做多少次 這就是所謂的 巢狀迴圈 的含義。對於巢狀迴圈連線的優缺點及適用場景如下 a...

Oracle 巢狀迴圈 雜湊連線

假設我們現在有一條語句,執行的時間需要半個小時,即使我們僅僅需要知道該語句的執行計畫,此種情況下,我們必須等待半個小時。因此,如果查詢的效能很慢,我們可以選擇選擇使用explain plan for select from table dbms xplan.display 命令。select use...