資料準備
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 一樣,連線兩張表,大致分為內連線,外連線,右連線,左連線,自然連線。這裡描述先甩出一張用爛了的...