MySQL數(shù)據(jù)庫中的join的實際應用演示
此文章主要向大家描述的是MySQL數(shù)據(jù)庫中的join的實際應用,我們大家都知道MySQL數(shù)據(jù)庫的join只有一種,及nested loop。對于在被連接的數(shù)據(jù)子集處于較小的情況下,nested loop連接是個較好的選擇。
nested loop就是掃描一個表,每讀到一條記錄,就根據(jù)索引去另一個表里面查找,沒有索引一般就不會是 nested loops。
一般在nested loop中, 驅(qū)動表滿足條件結(jié)果集不大,被驅(qū)動表的連接字段要有索引,這樣就走nstedloop。如果驅(qū)動表返回記錄太多,就不適合nested loops了。如果連接字段沒有索引,則適合走hash join,因為不需要索引。
這段說的是oracle下nestedloop。在MySQL中,只有nestedloop。
nested loop的過程:選擇row resource 最小的那個表作為驅(qū)動表(外部表),內(nèi)部表要求有選擇性高的index。 從外部表(驅(qū)動表)里一次取一行對內(nèi)部表的每行進行比較,即外部表有幾個distinct行,就有幾次nested loop。
所以nested loop的代價是:
- cost = outer access cost + (inner access cost * outer cardinality)
outer access cost應該是讀取驅(qū)動表到內(nèi)存,而內(nèi)部表要求有有效的index也是為了降低inner access cost,而驅(qū)動表要求小,也就很好理解了。
個人觀點:當被驅(qū)動表的連接字段并沒有建立索引時,用小結(jié)果集來驅(qū)動大結(jié)果集和用大結(jié)果集來驅(qū)動小結(jié)果集效果應該是一樣的,都需要全表掃,無非就是m*n和n*m的關(guān)系
簡朝陽在他的書中也有這么一段話:永遠用小結(jié)果集驅(qū)動大結(jié)果集……此優(yōu)化的前提條件是 通過join條件每次對各個表進行訪問的資源消耗差別不是太大。
如果資源消耗有較大的差別(一般都是因為索引的區(qū)別),就不能簡單的通過結(jié)果集的大小來判斷join語句的驅(qū)動順序,而是要通過比較循環(huán)次數(shù)和每次循環(huán)所須消耗之乘積大小來確定優(yōu)化方案了。
原文標題: MySQL的join
連接:http://www.cnblogs.com/arlen/articles/1752456.html
以上的相關(guān)內(nèi)容就是對MySQL數(shù)據(jù)庫中的join 的介紹,望你能有所收獲。
【編輯推薦】
- ASP.NET連接MySQL數(shù)據(jù)庫的正確解決方案
- 啟動與關(guān)閉MySQL的一大絕招
- MySQL免安裝版-添加服務實操演示
- MySQL數(shù)據(jù)庫中的自動備份破壞后的建立
- mssql轉(zhuǎn)換為MySQL數(shù)據(jù)庫經(jīng)驗漫談