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

2021-08-08 13:28:17 字數 1332 閱讀 4800

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

1.巢狀迴圈連線演算法

2.塊巢狀迴圈連線演算法

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

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

// 規則

table join type

t1 range

t2 ref

t3 all

// 簡單的nlj執行演算法

foreach row in t1 matching range

}}// nlj演算法的不足

nlj演算法一次將一行從外部迴圈傳遞到內部迴圈,所以通常會在內部迴圈中多次讀取表

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

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

當連線型別是all或者index的時候,可以使用連線緩衝 (換句話說,當沒有鍵(索引)可用的時候,對資料和索引各進行一次全掃瞄) range。緩衝的使用也適用於外連線

連線緩衝區從來不為第乙個常數表進行分配,即使它的型別是 all或 index。

只有有關系列儲存在其連線緩衝區中,而不是整行都放進去。

join_buffer_size 系統變數用於確定處理乙個查詢的每個連線的緩衝區的大小。

為每個可快取的連線分配乙個緩衝區,因此可以使用多個連線緩衝區處理給定的查詢。

在執行連線之前分配連線緩衝區,並在查詢完成後釋放。

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

foreach 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演算法會這麼來...

23 迴圈巢狀中演算法優化

100000以內的所有質數的輸出 體會演算法的優化一 public class primenumber1 if fag fag true system.out.println 質數個數為 even long end system.currenttimemillis system.out.printl...

巢狀迴圈之質數輸出演算法

long starttimes system.currenttimemillis 1 遍歷100以內的自然數 for int i 2 i 100000 i 1.3 如果i未被j整除輸出的本自然數一定是質數 if isflag true 2 輸出結束時的毫秒數 long endtime system....