56
57 rows: 3
58
59 Extra:
60
61 *************************** 3. row ***************************
62
63 id: 1
64
65 select_type: SIMPLE
66
67 table: c
68
69 type: ALL
70
71 possible_keys: NULL
72
73 key: NULL
74
75 key_len: NULL
76
77 ref: NULL
78
79 rows: 96
80
81 Extra: Using where; Using join buffer
我們看到不僅僅 group_message_content 表的訪問從 ref 變成了 ALL,此外,在最后一行的 Extra信息從沒有任何內容變成為 Using where; Using join buffer,也就是說,對于從 ref 變成 ALL 很容易理解,沒有可以使用的索引的索引了嘛,當然得進行全表掃描了,Using where 也是因為變成全表掃描之后,我們需要取得的 content 字段只能通過對表中的數據進行 where 過濾才能取得,但是后面出現的 Using join buffer 是一個啥呢?
我們知道,MySQL 中有一個供我們設置的參數 join_buffer_size ,這里實際上就是使用到了通過該參數所設置的 Buffer 區域。那為啥之前的執行計劃中沒有用到呢?
實際上,Join Buffer 只有當我們的 Join 類型為 ALL(如示例中),index,rang 或者是 index_merge 的時候 才能夠使用,所以,在我們去掉 group_message_content 表的 group_msg_id 字段的索引之前,由于 Join 是 ref 類型的,所以我們的執行計劃中并沒有看到有使用 Join Buffer。
當我們使用了 Join Buffer 之后,我們可以通過下面的這張圖片來表示 Join 完成過程:
