mysql join實現演算法

2021-10-04 16:40:49 字數 2569 閱讀 6388

mysql join

join是sql中非常重要的運算子,8.0版本之前的mysql只支援一種join演算法-nested-loop join(巢狀迴圈連線)。nested-loop join有三種實現方式:****** nested-loop join,index nested-loop join,block nested-loop join。

演算法原理

1.****** nested-loop join

簡單來說巢狀迴圈連線演算法就是乙個雙層for 迴圈 ,通過迴圈外層表的行資料,逐個與內層表的所有行資料進行比較來獲取結果,當執行select * from user tb1 left join level tb2 on tb1.id=tb2.user_id時,我們會按類似下面**的思路進行資料匹配:

整個匹配過程會如下圖:

特點:

nested-loop join 簡單粗暴容易理解,就是通過雙層迴圈比較資料來獲得結果,但是這種演算法顯然太過於粗魯,如果每個表有1萬條資料,那麼對資料比較的次數=1萬 * 1萬 =1億次,很顯然這種查詢效率會非常慢。

當然mysql 肯定不會這麼粗暴的去進行表的連線,所以就出現了後面的兩種對nested-loop join 優化演算法,在執行join 查詢時mysql 會根據情況選擇 後面的兩種優join優化演算法的一種進行join查詢。

2.index nested-loop join

ndex nested-loop join其優化的思路 主要是為了減少內層表資料的匹配次數, 簡單來說index nested-loop join 就是通過外層表匹配條件 直接與內層表索引進行匹配,避免和內層表的每條記錄去進行比較, 這樣極大的減少了對內層表的匹配次數,從原來的匹配次數=外層錶行數 * 內層錶行數,變成了 外層表的行數 * 內層表索引的高度,極大的提公升了 join的效能。

案例:如sql:select * from user tb1 left join level tb2 on tb1.id=tb2.user_id

當level 表的 user_id 為索引的時候執行過程會如下圖:

注意:使用index nested-loop join 演算法的前提是匹配的字段必須建立了索引。

3.block nested-loop join

block nested-loop join 其優化思路是減少外層表的迴圈次數,block nested-loop join 通過一次性快取多條資料,把參與查詢的列快取到join buffer 裡,,然後拿join buffer裡的資料批量與內層表的資料進行匹配,從而減少了外層迴圈的次數,當我們不使用index nested-loop join的時候,預設使用的是block nested-loop join。

案例:如sql:select * from user tb1 left join level tb2 on tb1.id=tb2.user_id當level 表的 user_id 不為索引的時候執行過程會如下圖:

1、使用block nested-loop join 演算法需要開啟優化器管理配置的optimizer_switch的設定block_nested_loop為on 預設為開啟,如果關閉則使用****** nested-loop join 演算法;

2、設定join buffer 的大小

通過join_buffer_size引數可設定join buffer的大小

join 演算法總結

不論是index nested-loop join 還是 block nested-loop join 都是在****** nested-loop join的演算法的基礎上 減少巢狀的迴圈次數,不同的是 index nested-loop join 是通過索引的機制減少內層表的迴圈次數,block nested-loop join 是通過一次快取多條資料批量匹配的方式來減少外層表的迴圈次數,通過 理解join 的演算法原理我們可以得出以下表連線查詢的優化思路。

1、永遠用小結果集驅動大結果集(其本質就是減少外層迴圈的資料數量)

2、為匹配的條件增加索引(減少內層表的迴圈次數)

3、增大join buffer size的大小(一次快取的資料越多,那麼外層表迴圈的次數就越少)

4、減少不必要的字段查詢(欄位越少,join buffer 所快取的資料就越多,外層表的迴圈次數就越少)

MySQL JOIN演算法原理

mysql的join相關操作,是通過 巢狀迴圈連線演算法,nlj 或者該演算法的優化變體 塊巢狀迴圈連線演算法,bnlj 來實現的。巢狀迴圈連線演算法 兩個表join時,可以簡單理解為兩層for迴圈,外層迴圈一般稱作驅動表,循壞內層稱作被驅動表。每次取出驅動表中一條資料,然後通過內迴圈遍歷被驅動表,...

MySQL JOIN實現表關聯

資料準備 create table student stu no int 10 name varchar 20 insert student values 1 mike insert student values 2 jin insert student values 3 tina insert s...

mysql Join演算法學習記錄

通過此次學習可以了解到join演算法的種類和原理,從而達到優化join語句 join演算法分類 nested loop join 中文意思為 巢狀迴圈鏈結 在mysql的實現中,nested loop join有3種實現的演算法 nested loop index nested loop join ...