mysql Join演算法學習記錄

2021-10-07 09:28:08 字數 1827 閱讀 6260

通過此次學習可以了解到join演算法的種類和原理,從而達到優化join語句

join演算法分類

nested-loop join 中文意思為「 巢狀迴圈鏈結」。

在mysql的實現中,nested_loop join有3種實現的演算法:

****** nested-loop

index nested-loop join (減少匹配表資料的匹配次數)

索引巢狀迴圈連線是基於索引進行連線的演算法,索引是指非驅動表(被驅動表)的索引,在查詢時,驅動表會根據關聯欄位的索引(被驅動表的索引)進行查詢,當在索引上找到符合的值,再回表進行查詢。如果驅動表的關聯鍵是主鍵的話,效能會非常高,如果不是主鍵,要進行多次回表查詢,效能上比索引是主鍵要慢。

原來的匹配次數 = 驅動錶行數 * 被驅動錶行數

優化後的匹配次數 = 驅動表索引的行數 * 被驅動表的索引高度

使用場景:只用匹配表 join 的列有索引時,才會使用index nested-loop join

如果索引是輔助索引而且返回的資料還包括匹配表的其他資料,那麼會回匹配表查詢,回增加io操作。

block nested_loop join(減少被驅動表資料的迴圈次數)

1.快取塊巢狀迴圈鏈結是同過一次性快取多條資料,把參與查詢的列快取到join buffer 裡,然後拿join buffer 裡面的資料批量與被驅動表的資料進行匹配,從而減少了被驅動表迴圈的次數(遍歷一次被驅動表就可以批量匹配一次join buffer裡面的驅動表資料)。

2.當不使用index nested-loop join 時,預設使用 block nested-loop join.

3.什麼是join buffer?

1. join buffer 會快取 所有參與查詢的列而不是只有join的列。

2. 可以通過調整join_buffer_size來調節快取大小

3. join_buffer_size 的預設值為256k,在5.1.22版本之前最大值是4g-1,之後才能在64位作業系統下申請大於4g

4. 使用block nested-loop join 演算法需要開啟優化器管理配置的optimizer_switch的設定block_nested_loop為on,預設開啟

如何優化join速度

用小的結果集驅動大的結果集,減少外層迴圈的數量:

如果小結果集和大結果集連線的列都是索引列,mysql在內連線時也會選擇小結果集驅動大結果集,因為索引查詢的成本是比較固定的,這時候驅動表的迴圈次數越少,join的速度越快,大結果集的索引不會用到

2. 為匹配的條件新增索引

3. 當使用bnlj時,加大join_buffer_size,一次快取的資料越多,外層表迴圈的次數就越少

4. 減少不必要的字段查詢:

1. 當使用bnlj時,欄位越少,join buffer所快取的資料就越多,外層表的迴圈次數就越少

2. 當使用inlj時,如果可以不回表查,即利用覆蓋索引,那也可以提高查詢速度

如何確定驅動表

通常來說就是explain分析之後結果的第乙個表就是驅動表

當使用left join時,左表是驅動表,右表為匹配表

當使用right join 時,右表是驅動表

當使用join 時,mysql會選擇資料量較小的表為驅動表。

不是主鍵與主鍵的join,不用考慮驅動表的選擇

演算法學習記錄

排序演算法複雜度 層序遍歷 雙端佇列 演算法流程 特例處理 當樹的根節點為空,則直接返回空列表 初始化 列印結果空列表 res 包含根節點的雙端佇列 queue bfs 迴圈 當 queue 為空時跳出 新建列表 temp 用於臨時儲存當前層列印結果 當前層列印迴圈 迴圈次數為當前層節點數 即 qu...

Manacher s演算法學習記錄

在leetcode上刷題時遇到了這個問題,認真學習了該演算法。參考 演算法共分為三步 1.將字串a轉化為奇數長度字串b 2.計算字串b中以每乙個元素為中心的回文子串長度得到數字陣列c 3.獲取c中的最大值並依據此最大值擷取字串a得到目標最長的回文字串。直接上關鍵 預處理原始字串,將其轉化為奇數長度。...

PCA演算法學習記錄

重要宣告 以下內容主要參考吳恩達機器學習課程和張洋的pca數學原理文章 降維 dimensionality reduction 降維的目的 1 資料壓縮 2 視覺化資料。pca principal component analysis 是一種常用的資料分析方法。pca通過線性變換將原始資料變換為一組...