成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

MySQL中Join的算法(NLJ、BNL、BKA)詳解

瀏覽:12日期:2023-06-23 19:40:37
目錄什么是JoinIndex Nested-Loop JoinBlock Nested-Loop JoinMRR & BKA總結什么是Join

在MySQL中,Join是一種用于組合兩個或多個表中數據的查詢操作。

Join操作通常基于兩個表中的某些共同的列進行,這些列在兩個表中都存在。

MySQL支持多種類型的Join操作,如Inner Join、Left Join、Right Join、Full Join等。

Inner Join是最常見的Join類型之一。在Inner Join操作中,只有在兩個表中都存在的行才會被返回。

例如,如果我們有一個“customers”表和一個“orders”表,我們可以通過在這兩個表中共享“customer_id”列來組合它們的數據。

SELECT *FROM customersINNER JOIN ordersON customers.customer_id = orders.customer_id;

上面的查詢將返回所有存在于“customers”和“orders”表中的“customer_id”列相同的行。

Index Nested-Loop Join

Index Nested-Loop Join(NLJ)算法是Join算法中最基本的算法之一。在NLJ算法中,MySQL首先選擇一個表(通常是小型表)作為驅動表,并迭代該表中的每一行。然后,MySQL在第二個表中搜索匹配條件的行,這個搜索過程通常使用索引來完成。一旦找到匹配的行,MySQL將這些行組合在一起,并將它們作為結果集返回。

工作流程如圖:

例如,下面這個語句:

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

在這個語句里,假設t1 是驅動表,t2是被驅動表。我們來看一下這條語句的explain結果。

可以看到,在這條語句里,被驅動表t2的字段a上有索引,join過程用上了這個索引,因此這個語句的執行流程是這樣的:

從表t1中讀入一行數據 R;從數據行R中,取出a字段到表t2里去查找;取出表t2中滿足條件的行,跟R組成一行,作為結果集的一部分;重復執行步驟1到3,直到表t1的末尾循環結束。

這個過程就跟我們寫程序時的嵌套查詢類似,并且可以用上被驅動表的索引,所以我們稱之為**“Index Nested-Loop Join”,簡稱NLJ**。

NLJ是使用上了索引的情況,如果查詢條件沒有使用到索引呢?

MySQL會選擇使用另一個叫作**“Block Nested-Loop Join”的算法,簡稱BNL**。

Block Nested-Loop Join

Block Nested Loop Join(BNL)算法與NLJ算法不同的是,BNL算法使用一個類似于緩存的機制,將表數據分成多個塊,然后逐個處理這些塊,以減少內存和CPU的消耗。

例如,下面這個語句:

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

字段b上是沒有建立索引的。

這時候,被驅動表上沒有可用的索引,算法的流程是這樣的:

把表t1的數據讀入線程內存join_buffer中,由于我們這個語句中寫的是select *,因此是把整個表t1放入了內存;掃描表t2,把表t2中的每一行取出來,跟join_buffer中的數據做對比,滿足join條件的,作為結果集的一部分返回。

這條SQL語句的explain結果如下所示:

可以看到,在這個過程中,對表t1和t2都做了一次全表掃描,因此總的掃描行數是1100。由于join_buffer是以無序數組的方式組織的,因此對表t2中的每一行,都要做100次判斷,總共需要在內存中做的判斷次數是:100*1000=10萬次。

雖然Block Nested-Loop Join算法是全表掃描。但是是在內存中進行的判斷操作,速度上會快很多。但是性能仍然不如NLJ。

join_buffer的大小是由參數join_buffer_size設定的,默認值是256k。如果放不下表t1的所有數據話,策略很簡單,就是分段放。

順序讀取數據行放入join_buffer中,直到join_buffer滿了。掃描被驅動表跟join_buffer中的數據做對比,滿足join條件的,作為結果集的一部分返回。清空join_buffer,重復上述步驟。

雖然分成多次放入join_buffer,但是判斷等值條件的次數還是不變的,依然是10萬次。

MRR & BKA

上篇文章里我們講到了MRR(Multi-Range Read)。MySQL在5.6版本后引入了Batched Key Acess(BKA)算法了。這個BKA算法,其實就是對NLJ算法的優化,BKA算法正是基于MRR。

NLJ算法執行的邏輯是:從驅動表t1,一行行地取出a的值,再到被驅動表t2去做join。也就是說,對于表t2來說,每次都是匹配一個值。這時,MRR的優勢就用不上了。

我們可以從表t1里一次性地多拿些行出來,,先放到一個臨時內存,一起傳給表t2。這個臨時內存不是別人,就是join_buffer。

通過上一篇文章,我們知道join_buffer 在BNL算法里的作用,是暫存驅動表的數據。但是在NLJ算法里并沒有用。那么,我們剛好就可以復用join_buffer到BKA算法中。

NLJ算法優化后的BKA算法的流程,如圖所示:

圖中,我在join_buffer中放入的數據是P1~P100,表示的是只會取查詢需要的字段。當然,如果join buffer放不下P1~P100的所有數據,就會把這100行數據分成多段執行上圖的流程。

如果要使用BKA優化算法的話,你需要在執行SQL語句之前,先設置

set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';

其中,前兩個參數的作用是要啟用MRR。這么做的原因是,BKA算法的優化要依賴于MRR。

對于BNL,我們可以通過建立索引轉為BKA。對于一些列建立索引代價太大,不好建立索引的情況,我們可以使用臨時表去優化。

例如,對于這個語句:

select * from t1 join t2 on (t1.b=t2.b) where t2.b>=1 and t2.b<=2000;

使用臨時表的大致思路是:

把表t2中滿足條件的數據放在臨時表tmp_t中;為了讓join使用BKA算法,給臨時表tmp_t的字段b加上索引;讓表t1和tmp_t做join操作。

這樣可以大大減少掃描的行數,提升性能。

總結

在MySQL中,不管Join使用的是NLJ還是BNL總是應該使用小表做驅動表。更準確地說,**在決定哪個表做驅動表的時候,應該是兩個表按照各自的條件過濾,過濾完成之后,計算參與join的各個字段的總數據量,數據量小的那個表,就是“小表”,應該作為驅動表。**應當盡量避免使用BNL算法,如果確認優化器會使用BNL算法,就需要做優化。優化的常見做法是,給被驅動表的join字段加上索引,把BNL算法轉成BKA算法。對于不好在索引的情況,可以基于臨時表的改進方案,提前過濾出小數據添加索引。

到此這篇關于MySQL中Join的算法(NLJ、BNL、BKA)詳解的文章就介紹到這了,更多相關MySQL中Join的算法內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
色噜噜狠狠成人网p站| 欧美 日韩 国产 一区| 99国产精品99久久久久久| 欧美日韩成人在线一区| 亚洲欧美经典视频| 亚洲图色在线| 亚洲国产精品黑人久久久| av中文字幕亚洲| 欧美成人三级电影在线| 国产精品99久久久| 欧美一区二区在线播放| 国产毛片精品视频| 日韩一二三四区| 岛国一区二区三区| 精品精品国产高清一毛片一天堂| 成人免费视频播放| 精品欧美久久久| 成人av在线资源网站| 欧美v亚洲v综合ⅴ国产v| 国产大片一区二区| 精品人伦一区二区色婷婷| 国产91精品入口| 欧美大黄免费观看| 91亚洲精品乱码久久久久久蜜桃| 久久夜色精品国产欧美乱极品| fc2成人免费人成在线观看播放| 欧美tickling网站挠脚心| 成人国产精品免费网站| 国产午夜精品一区二区三区视频| 欧美连裤袜在线视频| 亚洲人成精品久久久久久| 国产欧美精品久久| 视频在线观看国产精品| 欧美四级电影在线观看| 国产精品123| 久久久www成人免费毛片麻豆| 欧美日韩 国产精品| 亚洲视频 欧洲视频| 国产精品永久入口久久久| 亚洲国产精品久久久久秋霞影院| 色婷婷国产精品久久包臀| 国产曰批免费观看久久久| 精品国产精品网麻豆系列| 欧美视频四区| 夜夜爽夜夜爽精品视频| 在线观看三级视频欧美| 国产盗摄视频一区二区三区| 国产午夜精品久久久久久免费视| 激情文学一区| 亚洲福利视频三区| 欧美丝袜自拍制服另类| 成人福利电影精品一区二区在线观看 | 毛片av一区二区| 正在播放亚洲一区| 国产精品久久| 日韩成人一级片| 日韩一区二区免费视频| 欧美日韩午夜| 首页亚洲欧美制服丝腿| 欧美一级生活片| 激情综合网址| 肉色丝袜一区二区| 日韩一区二区三| 亚洲高清视频一区二区| 欧美a级理论片| 久久久一区二区三区| 国产日产高清欧美一区二区三区| 久久99国内精品| 中文字幕久久午夜不卡| 在线免费观看成人短视频| 99热这里都是精品| 亚洲国产欧美在线| 欧美成人三级电影在线| 国产精品美女久久久浪潮软件| 免费久久99精品国产| 久久综合九色综合97婷婷女人 | 久久婷婷国产综合国色天香| 国产欧美激情| 国产suv精品一区二区883| 亚洲私人影院在线观看| 欧美高清激情brazzers| 亚洲高清毛片| 韩国v欧美v亚洲v日本v| 欧美日韩在线不卡| 另类小说欧美激情| 国产精品欧美一区喷水| 精品视频123区在线观看| 欧美精品一区在线发布| 日本欧美韩国一区三区| 国产三级一区二区| 色噜噜夜夜夜综合网| 欧美va天堂在线| 日韩国产欧美在线观看| 久久精品免视看| 91黄色在线观看| 欧美连裤袜在线视频| 久久99在线观看| 亚洲视频在线一区| 日韩欧美在线123| 亚洲影视在线| 欧美一区二视频在线免费观看| 男女男精品网站| 中文字幕一区二区三区在线播放 | 亚洲三级视频在线观看| 欧美精品久久久久久久多人混战 | 99精品国产在热久久下载| 国产电影一区在线| 亚洲一区免费观看| 久久久久国产精品麻豆ai换脸| 久久精品99| 韩日成人在线| 高清国产一区二区三区| 肉色丝袜一区二区| 国产精品久99| 日韩精品一区二区在线| 久久亚洲午夜电影| 亚洲高清免费| 92精品国产成人观看免费| 九色porny丨国产精品| 一区二区三区成人| 欧美www视频| 欧美性大战xxxxx久久久| 99riav1国产精品视频| 91尤物视频在线观看| 国产综合成人久久大片91| 亚洲国产欧美一区二区三区丁香婷| 国产香蕉久久精品综合网| 欧美一区二区女人| 色一情一乱一乱一91av| 亚洲激情成人| 女女同性女同一区二区三区91| 极品瑜伽女神91| 午夜av一区二区三区| 亚洲蜜臀av乱码久久精品蜜桃| 久久久五月婷婷| 日韩亚洲欧美在线观看| 在线精品视频小说1| 国产女主播一区二区| 国产一区二区三区四区hd| www.av精品| 懂色中文一区二区在线播放| 加勒比av一区二区| 蜜臀久久99精品久久久久久9| 夜夜嗨av一区二区三区网页| 亚洲欧洲99久久| 国产喷白浆一区二区三区| 精品剧情v国产在线观看在线| 制服丝袜日韩国产| 欧美色手机在线观看| 色婷婷亚洲综合| 久久av一区二区| 国产亚洲一区在线| 99在线精品免费视频九九视| 黄色国产精品| 国产精品激情| 欧美日韩高清在线一区| 欧美/亚洲一区| 91麻豆免费视频| 天天色综合天天| 日韩专区中文字幕一区二区| 亚洲高清在线视频| 亚洲v精品v日韩v欧美v专区| 亚洲一级二级三级在线免费观看| 一区二区三区四区av| 一区二区三区中文字幕电影| 中文字幕中文字幕在线一区| 国产欧美一区二区三区在线老狼| 亚洲精品一区二区三区影院| 精品三级在线观看| 26uuu久久天堂性欧美| 亚洲精品在线电影| 久久亚洲一级片| 国产亚洲人成网站| 国产日韩在线不卡| 国产精品美女久久久久久久久久久 | 6080日韩午夜伦伦午夜伦| 欧美人牲a欧美精品| 欧美情侣在线播放| 91超碰这里只有精品国产| 91精品午夜视频| 精品国精品国产| 国产欧美日韩激情| 综合在线观看色| 亚洲午夜在线视频| 免费的成人av| 国产一区美女在线| 99热99精品| 欧美午夜精品理论片a级大开眼界| 国产在线日韩| 一区二区三区三区在线| 欧美中日韩免费视频| 在线观看亚洲精品视频| 欧美精品一卡两卡| 91精品国产91热久久久做人人| 日韩免费视频一区二区| 国产婷婷一区二区| 亚洲桃色在线一区| 亚洲6080在线| 久久99国产乱子伦精品免费| 国产suv一区二区三区88区|