1. 程式人生 > >MySQL中Join演算法實現原理通俗易懂

MySQL中Join演算法實現原理通俗易懂

注意:MySQL 5.1.18之後的版本中才會體現出來

一:原理:

在MySQL 中,只有一種 Join 演算法,就是大名鼎鼎的 Nested Loop Join,他沒有其他很多資料庫所提供的 Hash Join,也沒有 Sort Merge Join。
1.Nested Loop Join 實際上就是通過驅動表的結果集作為迴圈基礎資料,然後一條一條的通過該結果集中的資料作為過濾條件到下一個表中查詢資料,然後合併結果。
2.如果還有第三個參與 Join,則再通過前兩個表的 Join 結果集作為迴圈基礎資料,再一次通過迴圈查詢條件到第三個表中查詢資料,如此往復。

二:圖解

在這裡插入圖片描述
MySQL Query Optimizer 選擇了 user_group 作為驅動表,首先利用我們傳入的條件 user_id 通過 該表上面的索引 user_group_uid_ind 來進行 const 條件的索引 ref 查詢,
然後以 user_group 表中過濾出來的結果集的 group_id 欄位作為查詢條件,對 group_message 迴圈查詢,
然後再通過 user_group 和 group_message 兩個表的結果集中的 group_message 的 id 作為條件 與 group_message_content 的 group_msg_id 比較進行迴圈查詢,
才得到最終的結果。沒啥特別的,後一個引用前一個的結果集作為條件

三:去掉引擎

group_message_content 去掉上面的 idx_group_message_content_msg_id 這個索引,
在這裡插入圖片描述
group_message_content 表的訪問從 ref 變成了 ALL,此外,在最後一行的 Extra資訊從沒有任何內容變成為 Using where; Using join buffer,也就是說,對於從 ref 變成 ALL 很容易理解,沒有可以使用的索引的索引了嘛,當然得進行全表掃描了,Using where 也是因為變成全表掃描之後,我們需要取得的 content 欄位只能通過對錶中的資料進行 where 過濾才能取得