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

歡迎訪問 生活随笔!

生活随笔

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

数据库

mysql单单写join_MySQL系列之Join大法

發布時間:2023/12/15 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql单单写join_MySQL系列之Join大法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.?Index Nested-Loop Join

概念解釋:

假設有t1,t2兩張表,在join連接的時候,t1表驅動t2表,t1走的全部掃描,t2表使用了索引,

則這個時候join就使用了“index nested-loop join”算法,簡稱:NLJ。

NLJ執行的流程如下:

Index Nested-Loop Join 算法的執行流程

2.?Block Nested-Loop Join

基于上面t1表和t2表,join連接,t1表和t2表都沒有命中索引,都是走的全部掃描。這個

時候Join使用的是“Block Nested-Loop Join”算法,簡稱:BNL。

BNL算法的流程如下:

Block Nested-Loop Join 算法的執行流程

在explain分析語句的時候,extra附加信息中會出現“Using join buffer (Block Nested Loop)”。

join_buffer是由參數join_buffer_size決定的。默認是256k。如果放不下表 t1

的所有數據話,策略很簡單,就是分段放。

流程大概是:

取t1表的數據,放入join_buffer中,如果join buffer滿了,就掃描t2表的數據,跟join buffer

的數據進行對比,滿足join條件的作為結果集返回;清空join buffer,繼續上面的過程。

能否使用Join?

1.?如果可以使用 Index Nested-Loop Join 算法,也就是說可以用上被驅動表上的索引,

其實是沒問題的;

2.? 如果使用 Block Nested-Loop Join 算法,掃描行數就會過多。尤其是在大表上的 join

操作,這樣可能要掃描被驅動表很多次,會占用大量的系統資源。所以這種 join 盡量不

要用。

如果要使用 join,應該選擇大表做驅動表還是選擇小表做驅動表?

1. 如果是 Index Nested-Loop Join 算法,應該選擇小表做驅動表;

2.?如果是 Block Nested-Loop Join 算法:

在 join_buffer_size 足夠大的時候,是一樣的;

在 join_buffer_size 不夠大的時候(這種情況更常見),應該選擇小表做驅動表。

這個問題的結論就是,總是應該使用小表做驅動表。

注意:join慢的時候,盡量跳大join_buffer_size的值。

優化Join

1. 優化NLJ算法

Multi-Range Read 優化算法 (MRR)。這個優化的主要目的是盡量使用順序讀盤。

如果隨著輔助索引(二級索引) a 的值遞增順序查詢的話,主鍵索引id 的值就變成隨機的,

那么就會出現隨機訪問,性能相對較差。雖然“按行查”這個機制不能改,但是調整查詢的順序,

還是能夠加速的。這就是 MRR 優化的設計思路。

加入了MRR優化的執行流程如下:

1. 根據索引 a,定位到滿足條件的記錄,將 id 值放入 read_rnd_buffer 中 ;

2.?將 read_rnd_buffer 中的 id 進行遞增排序;

3. 排序后的 id 數組,依次到主鍵 id 索引中查記錄,并作為結果返回。

read_rnd_buffer 的大小是由 read_rnd_buffer_size 參數控制的。

啟用MRR算法:

set optimizer_switch="mrr_cost_based=off"

Batched Key Access (BKA) 算法

MySQL 在 5.6 引入的,是對 NLJ 算法的優化。

NLJ 算法優化后的 BKA 算法的流程如下:

Batched Key Acess 流程

啟用 BKA 算法:

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

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

BNL 算法的優化

優化的常見做法是,給被驅動表的 join 字段加上索引,把 BNL 算法轉成 BKA 算法。

但是如果無法在被驅動表上加索引,那么:

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

1. 把表 t2 中滿足條件的數據放在臨時表 tmp_t 中;

2. 為了讓 join 使用 BKA 算法,給臨時表 tmp_t 的字段 b 加上索引;

3. 讓表 t1 和 tmp_t 做 join 操作。

SQL語句為:

create temporary table temp_t(id int primary key, a int, b int, index(b))engine=innodb;

insert into temp_t select * from t2 where b>=1 and b<=2000;

select * from t1 join temp_t on (t1.b=temp_t.b);

總體來看,不論是在原表上加索引,還是用有索引的臨時表,我們的思路都是讓 join 語句

能夠用上被驅動表上的索引,來觸發 BKA 算法,提升查詢性能。

上面如果不適用臨時表進行優化,那么還有其他方式進行優化?

我們可以自己實現在業務端。實現流程大致如下:

1. select * from t1;取得表 t1 的全部 1000 行數據,在業務端存入一個 hash 結構,

比如 C++ 里的 set、PHP 的數組這樣的數據結構。

2. select * from t2 where b>=1 and b<=2000; 獲取表 t2 中滿足條件的 2000 行

數據。

3. 把這 2000 行數據,一行一行地取到業務端,到 hash 結構的數據表中尋找匹配的數

據。滿足匹配的條件的這行數據,就作為結果集的一行。

關于臨時表的幾個問題:

1.? binlog_format=row,那么跟臨時表有關的語句,就不會記錄到binlog 里。只在

binlog_format=statment/mixed 的時候,binlog 中才會記錄臨時表的操作。

2. 在使用臨時表的時候,最后最好要寫上 DROP TEMPORARY TABLE,刪除臨時表

3. 臨時表只對本session會話可見,對其他的session不可見。

總結

以上是生活随笔為你收集整理的mysql单单写join_MySQL系列之Join大法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 护士人妻hd中文字幕 | 干b视频在线观看 | 欧美一级特黄aaaaaa大片在线观看 | 中文字幕一区二区三区久久久 | 日韩精品一区二区三区四区 | 久久亚洲av无码精品色午夜麻豆 | 超级碰在线视频 | 伊人影片 | 少妇又色又爽又高潮极品 | 亚欧洲精品在线视频免费观看 | 日日碰狠狠躁久久躁蜜桃 | 97超碰碰碰 | 中文字幕在线官网 | 日本精品久久久久久久 | 精品日韩在线视频 | 免费av电影网站 | 伊人中文字幕在线观看 | 一卡二卡三卡在线观看 | 懂色av蜜臂av粉嫩av | eeuss一区二区 | 7777奇米影视 | 国产乱子伦精品无码码专区 | 韩日欧美| 国产男女无遮挡猛进猛出 | 国产午夜成人久久无码一区二区 | 宅男噜噜噜66一区二区 | 捆绑调教sm束缚网站 | 成年人看片网站 | 精品人妻一区二区免费视频 | 麻豆精品在线看 | 午夜噜噜 | 手机看片日韩欧美 | japanese24hdxxxx中文字幕 | 婷婷俺去也| 日本午夜视频在线观看 | 亚洲丝袜中文字幕 | 四虎精品欧美一区二区免费 | av免费毛片 | 免费成人深夜夜行网站视频 | 午夜影院在线观看视频 | 国产视频观看 | 成人免费毛片嘿嘿连载视频 | 色图插插插 | 视频在线观看电影完整版高清免费 | 黄视频国产 | 一区二区视频在线观看 | 91麻豆产精品久久久久久夏晴子 | 亚洲国产精品国自产拍久久 | 亚洲高清在线免费观看 | 清冷男神被c的合不拢腿男男 | 看av网站 | 美女福利视频网 | 精品一区电影国产 | 国产精品极品白嫩 | 亚洲人成7777| 欧美 日韩 国产 成人 | 免费av在线播放网址 | 一区二区国产在线观看 | 国产精品久久一区二区三区动 | 国产在线观看a | 欧美成人国产精品高潮 | 成人亚洲一区二区 | 国产大奶在线 | 伊人春色网| 在线播放黄色网址 | 亚洲av日韩精品久久久久久久 | 我要看18毛片 | 日本一区二区视频免费 | 欧美一级片播放 | 久久这里只有精品99 | 爱福利视频广场 | 视频精品一区二区 | 亚洲国产视频在线观看 | 又污又黄又爽的网站 | 国产二页 | 欧美网站免费 | 亚洲日本中文 | 综合色av| www.成人在线视频 | 91亚色在线观看 | 天天综合网站 | 先锋资源av在线 | 色老头一区二区三区 | 正在播放超嫩在线播放 | 丰满人妻妇伦又伦精品国产 | 亚洲女人天堂成人av在线 | 国产特黄毛片 | 国产精品815.cc红桃 | 18禁免费无码无遮挡不卡网站 | 亚洲区免费 | 正在播放一区二区 | 国产淫| 伊人久久成人网 | 黄色免费网站观看 | 欧美性猛交久久久久 | 黑人毛片网站 | 插插网站| 国产一区二区三区免费观看视频 | 欧美一区二区三区四区视频 |