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 ...