日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql join 算法_【MySQL】之join算法详解

發布時間:2025/3/20 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql join 算法_【MySQL】之join算法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在阿里巴巴的java開發手冊有這么一條強制規定:超過三個表禁止join,需要join的字段,數據類型保持絕對一致,多表關聯查詢時,要保證被關聯的字段需要有索引。

為什么盡量避免使用join?如果使用join,我們應該怎么用呢?接下來我們就一起聊一聊關于join的幾種算法。

Simple Nested-Loop Join

Simple Nested-Loop Join算法是指讀取驅動表t1中的每行數據,將每行數據傳遞到被驅動表t2上,取出被驅動表t2中滿足條件的行,和t1組成結果集。

在這個算法中,需要對t1進行全表掃描,假設t1表1000行數據,那么需要對t2表進行1000次全表掃描,假設t2表也是1000行數據,那么就需要掃描1000 X 1000=1000000行。

示例圖如下:當t1表5行數據,t2表5行數據時,需要掃描25行數據。

Index Nested-Loop Join

index nested-loop join算法的優化思路是通過驅動表的匹配條件,直接與被驅動表的索引進行匹配,減少了被驅動表的掃描次數。

該算法同樣要對驅動表t1進行全表掃描,但是我們在拿著t1表的數據去被驅動表t2進行匹配時可以利用t2表的索引,如果t1表中1000行數據,t2表中1000行數據,那么一共就需要掃描1000+1000=2000行數據。這個過程就跟我們寫程序時的嵌套查詢類似,并且可以用上被驅動表的索引,所以稱之為“Index Nested-Loop Join”,簡稱 NLJ。

示例如下:當t1表有5行數據,t2表有5行數據時,一共需要掃描5+5=10行數據。

Block Nested-Loop Join

Block Nested-Loop join,基于塊的嵌套循環,簡稱BNL算法,其優化思路主要是減少被驅動表的循壞次數,它會將驅動表的數據緩存起來,把參與查詢的列緩存到join buffer里,然后拿join buffer里的數據批量與內層表的數據在join buffer中進行匹配,滿足join條件的,作為結果集的一部分返回。

可以看到該算法對兩個表都進行了全表掃描,因此掃描的行數是兩個表的行數之和。這種場景下,雖然在掃描行數上和NLJ算法一樣,但是由于BNL算法是在內存中進行判斷,速度上會快很多。

join buffer的大小是由參數join_buffer_size設定,默認256k。如果一次放不下驅動表的所有數據,會分段放,這種情況下會導致被驅動表掃描多次。如果被驅動表是冷數據表,并且多次掃描讀取被驅動表間隔超過1S的話,就會將他放入LRU鏈表的young區域,導致業務數據無法進入熱數據區,減少了bufferpool的命中率,這又是另外一個課題了,暫不過多展開。我們可以通過調大join_buffer_size來提高緩存的數據量,減少對被驅動表的掃描次數。

啟用BNL算法需要在optimizer_switch參數中設置block_nested_loop=on。

Batched Key Access

BNL算法提升了join的性能,但是它在通過輔助索引連接后需要回表,就會消耗大量的隨機I/O,我們知道隨機IO對MySQL的影響是非常大的。因此MySQL5.6引入了Batched Key Access(BKA,批量鍵訪問聯接)算法。

再說BKA算法時不得不提的就是MySQL的Multi-Range Read 優化,MRR的目的主要是減少磁盤的隨機訪問。我們都知道,Innodb索引采用的是B+tree的數據結構,數據保存在主鍵索引中,并且是按照主鍵遞增的順序插入的,但是二級索引的排列順序和主鍵的排列順序一般是不一樣的,它保存的主鍵值也并非按照主鍵順序排列,在回表時就會出現隨機訪問主鍵索引的情況。所以如果可以按照主鍵遞增順序查詢的話,對磁盤的讀比較接近順序讀,這樣就能夠提升讀性能。

MRR優化的思路就是在進行范圍查詢時,在得到主鍵值之后,先按照主鍵的順序進行排序,然后拿著排好序的主鍵ID再去主鍵索引進行查詢,這樣就能體現出順序性的優勢了。因為是多值查詢,所以一般用于range、ref類型的查詢。

再說會BKA算法,當被驅動表上有索引可以利用時,那么就在行提交給被 join 的表之前,先對兩個表的對應列的索引字段進行join,得到主鍵值后,按照主鍵排好序后,利用 MRR 技術,批量訪問表取數據,減少了隨機 IO。但是如果被 join 的表沒用索引的話,那就只能使用BNL算法了。

具體算法如下圖:

開啟BKA和MRR的方式:

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

MySQL在8.0版本已經實現了hash join,這里暫不做介紹。

小結

如何優化join的速度呢,這里給出如下幾點建議:

盡量避免使用join。

用小表作為驅動表,減少外層循環的次數。

多表關聯查詢時,要保證被關聯的字段要有索引。

適當增大join_buffer_size的值,緩存的數據越多,就越能減少被驅動表掃描的次數。

減少不必要的字段查詢。

需要join的字段,數據類型保持絕對一致。

本文分享自微信公眾號 - MySQL數據庫技術棧(Mysqltechnology)。

如有侵權,請聯系 support@oschina.cn 刪除。

本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

總結

以上是生活随笔為你收集整理的mysql join 算法_【MySQL】之join算法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本69式三人交 | 成人免费在线视频 | 欧美变态口味重另类 | 日产毛片 | 影音先锋日韩资源 | 成都电影免费大全 | 成年人小视频在线观看 | 大桥未久av在线播放 | 日韩 欧美 亚洲 | av福利院| 色综合天天综合网天天狠天天 | 人妻少妇偷人精品无码 | 日韩激情网址 | 在线三级av| www.色香蕉 | 那个网站可以看毛片 | 欧美成人福利视频 | 国产小毛片 | 秋霞自拍 | 九九热视频在线 | 浴室里强摁做开腿呻吟男男 | 国产精品福利一区二区三区 | 欧美区一区二区三 | 亚洲少妇在线 | 91蜜桃传媒精品久久久一区二区 | 亚洲欧美日韩成人 | 国产又粗又长 | 黄色免费看网站 | 草草影院在线观看视频 | 在线永久看片免费的视频 | 日韩精品片 | 日日鲁鲁鲁夜夜爽爽狠狠视频97 | av黄色片| 免费观看成人 | 钰慧的mv视频在线观看 | 五月婷婷,六月丁香 | 国产日韩精品一区二区三区在线 | 国产精品无码网站 | 成年人性生活免费视频 | 欧美成人精品一区二区男人看 | av网址免费| 欧洲亚洲女同hd | 日韩精品一区二区三区国语自制 | 日韩精品一区二区不卡 | 91麻豆精品国产91久久久久久 | 国产少妇一区二区 | 久久精品成人一区二区三区蜜臀 | 国产crm系统91在线 | 99av国产精品欲麻豆 | 日本黄色特级片 | 亚洲高清二区 | 请用你的手指扰乱我吧 | 日日操夜夜摸 | 91麻豆精品国产 | 骚黄网站 | 好色av | 久久成人国产精品入口 | 99riav国产| 久久久永久久久人妻精品麻豆 | 日韩特级片 | 国产熟女一区二区三区四区 | 一级黄色片看看 | 九热精品 | 亚洲最新在线 | 久久久久国色av免费观看性色 | 久操影视| 亚洲第一在线播放 | 成在人线av | 色人阁在线视频 | 久久午夜精品 | 日本国产在线播放 | 久色视频在线播放 | 桃花岛影院 | av美国 | 免费观看黄色网址 | 亚洲九九在线 | 色综网| 99视频+国产日韩欧美 | 成人久久一区 | 三级一区二区 | 靠逼视频免费网站 | 国内精品视频一区 | 欧美亚洲另类在线 | 91精品国产综合久久福利软件 | 国产在线观看免费视频今夜 | 草久在线| 91不卡在线 | 337p嫩模大胆色肉噜噜噜 | 四虎一国产精品一区二区影院 | 99视频国产精品免费观看a | 国产精品区二区三区日本 | 日本不卡一区在线 | 亚洲精品男人的天堂 | 日韩精品一区二区电影 | 初高中福利视频网站 | 亚洲精品黄色 | 日本午夜电影网站 | 免费手机av | 久久久久亚洲AV成人无码国产 |