join演算法原理和優化

2022-01-20 09:48:19 字數 1946 閱讀 8458

資料準備

t1 100行

id 主鍵

a t2 1000行

id 主鍵

a 索引

b

index nested-loop join

sql

select * from t1 straight_join t2 on (t1.a=t2.a);

t1為驅動表,t2為被驅動表

執行流程

1.從表 t1 中讀入一行資料 r;

2.從資料行 r 中,取出 a 欄位到表 t2 裡去查詢;

3.取出表 t2 中滿足條件的行,跟 r 組成一行,作為結果集的一部分;

4.重複執行步驟 1 到 3,直到表 t1 的末尾迴圈結束

執行效率

由於t2的a有索引,所以大約掃瞄了200行
block nested-loop join

sql

select * from t1 straight_join t2 on (t1.a=t2.b);

t1為驅動表,t2為被驅動表

執行流程

1.把錶 t1 的資料讀入執行緒記憶體 join_buffer 中,由於我們這個語句中寫的是 select *,因此是把整個表 t1 放入了記憶體;

2.掃瞄表 t2,把錶 t2 中的每一行取出來,跟 join_buffer 中的資料做對比,滿足 join 條件的,作為結果集的一部分返回。

執行效率

由於t2的b沒有有索引,沒查t1一條資料,t2差不多都是一次全表查詢,掃瞄最多為100x1000=100000
如果表t1過大

因為join_buffer大小有限,所以出現了下面的執行流程
執行流程2

1.掃瞄表 t1,順序讀取資料行放入 join_buffer 中,放完第 88 行 join_buffer 滿了,繼續第 2 步;

2.掃瞄表 t2,把 t2 中的每一行取出來,跟 join_buffer 中的資料做對比,滿足 join 條件的,作為結果集的一部分返回;

3.清空 join_buffer;

4.繼續掃瞄表 t1,順序讀取最後的 12 行資料放入 join_buffer 中,繼續執行第 2 步

執行效率

由於涉及join_buffer,清空和加資料,他的效率更低
優化

小表

綜合字段數,記錄數小的表作為驅動表
join_buffer設定更大空間

可以減少join_buffer的清空次數
重要:加索引

200和10w,你自己選,如果是10w和10w呢,無法想象

(十三)Join原理,Join優化

聯結兩個表時,如果第二個表上有聯結鍵索引,那麼就會根據第乙個表中查出的聯結鍵值搜尋索引,然後根據索引得到的主鍵id去第二張表找 在這種情況下 使用 join 語句,效能比強行拆成多個單錶執行 sql 語句的效能要好 如果使用 join 語句的話,需要讓小表做驅動表。聯結兩個表時,如果第二個表上沒有聯...

Mysql中join連線演算法和優化思路

1.看explain的結果,如果extra欄位裡面出現 block nested loop 即這時候sql查詢使用block nested loop join演算法,就意味著效能較差,不建議使用。2.join連線中盡可能使用小表做驅動表 通過下面的join語句分別分析一下幾種join連線演算法的過程...

MySql系列(三) JOIN的原理和演算法

博主今天為大家帶來join的原理,只有少部分,有待補充提高,如有更好地建議,歡飲討論!以下所寫內容均與以前的文章有聯絡可以前往博文檢視,陳永佳的部落格 什麼是join?join的含義就如英文單詞 join 一樣,連線兩張表,大致分為內連線,外連線,右連線,左連線,自然連線。這裡描述先甩出一張用爛了的...