此文章主要向大家描述的是MySQL數據庫中的join的實際應用,我們大家都知道MySQL數據庫的join只有一種,及nested loop。對於在被連接的數據子集處於較小的情況下,nested loop連接是個較好的選擇。
nested loop就是掃描一個表,每讀到一條記錄,就根據索引去另一個表裡面查找,沒有索引一般就不會是 nested loops。
一般在nested loop中, 驅動表滿足條件結果集不大,被驅動表的連接字段要有索引,這樣就走nstedloop。如果驅動表返回記錄太多,就不適合nested loops了。如果連接字段沒有索引,則適合走hash join,因為不需要索引。
這段說的是oracle下nestedloop。在MySQL中,只有nestedloop。
nested loop的過程:選擇row resource 最小的那個表作為驅動表外部表),內部表要求有選擇性高的index。 從外部表驅動表)裡一次取一行對內部表的每行進行比較,即外部表有幾個distinct行,就有幾次nested loop。
所以nested loop的代價是:
- cost = outer access cost + (inner access cost * outer cardinality)
outer access cost應該是讀取驅動表到內存,而內部表要求有有效的index也是為了降低inner access cost,而驅動表要求小,也就很好理解了。
個人觀點:當被驅動表的連接字段並沒有建立索引時,用小結果集來驅動大結果集和用大結果集來驅動小結果集效果應該是一樣的,都需要全表掃,無非就是m*n和n*m的關系
簡朝陽在他的書中也有這麼一段話:永遠用小結果集驅動大結果集……此優化的前提條件是 通過join條件每次對各個表進行訪問的資源消耗差別不是太大。
如果資源消耗有較大的差別(一般都是因為索引的區別),就不能簡單的通過結果集的大小來判斷join語句的驅動順序,而是要通過比較循環次數和每次循環所須消耗之乘積大小來確定優化方案了。
原文標題: MySQL的join
連接:http://www.cnblogs.com/arlen/articles/1752456.html
以上的相關內容就是對MySQL數據庫中的join 的介紹,望你能有所收獲。