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