电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:3日期: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 數據庫
主站蜘蛛池模板: 防弹玻璃厂家_防爆炸玻璃_电磁屏蔽玻璃-四川大硅特玻科技有限公司 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 上海阳光泵业制造有限公司 -【官方网站】 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 全自动变压器变比组别测试仪-手持式直流电阻测试仪-上海来扬电气 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 换链神器官网-友情链接交换、购买交易于一体的站长平台 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 板式换热器_板式换热器价格_管式换热器厂家-青岛康景辉 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 西装定制/做厂家/公司_西装订做/制价格/费用-北京圣达信西装 | 丹尼克尔拧紧枪_自动送钉机_智能电批_柔性振动盘_螺丝供料器品牌 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 高铝矾土熟料_细粉_骨料_消失模_铸造用铝矾土_铝酸钙粉—嵩峰厂家 | 郑州律师咨询-郑州律师事务所_河南锦盾律师事务所 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 镀锌角钢_槽钢_扁钢_圆钢_方矩管厂家_镀锌花纹板-海邦钢铁(天津)有限公司 | 氢氧化钙设备_厂家-淄博工贸有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 粉末包装机,拆包机厂家,价格-上海强牛包装机械设备有限公司 | 长春网站建设,五合一网站设计制作,免费优化推广-长春网站建设 | 100_150_200_250_300_350_400公斤压力空气压缩机-舰艇航天配套厂家 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 泰安塞纳春天装饰公司【网站】 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 |