Join語句的效率問題


先看第一個問題:能不能使用 join?

如果可以使用 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 的各個字段的總數據量,數據量小的那個表,就是“小表”,應該作為驅動表。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM