如果可以使用 Index Nested-Loop Join 算法,也就是說可以用上被驅動表上的索引, 其實是沒問題的;
如果使用 Block Nested-Loop Join 算法,掃描行數就會過多。尤其是在大表上的 join 操作,這樣可能要掃描被驅動表很多次,會占用大量的系統資源。所以這種 join 盡量不 要用。
所以你在判斷要不要使用 join 語句時,就是看 explain 結果里面,Extra 字段里面有沒有 出現“Block Nested Loop”字樣。
我們再來看看第二個問題:怎么選擇驅動表?
1. 如果是 Index Nested-Loop Join 算法,應該選擇小表做驅動表;
2. 如果是 Block Nested-Loop Join 算法:
在 join_buffer_size 足夠大的時候,是一樣的;
在 join_buffer_size 不夠大的時候(這種情況更常見),應該選擇小表做驅動表。
所以,這個問題的結論就是,總是應該使用小表做驅動表。
什么叫作“小表”。
在決定哪個表做驅動表的時候,應該是兩個表按照各自的條件過濾, 過濾完成之后,計算參與 join 的各個字段的總數據量,數據量小的那個表,就是“小表”,應該作為驅動表。