新聞中心
此文章主要向大家描述的是MySQL數(shù)據(jù)庫中的join的實際應(yīng)用,我們大家都知道MySQL數(shù)據(jù)庫的join只有一種,及nested loop。對于在被連接的數(shù)據(jù)子集處于較小的情況下,nested loop連接是個較好的選擇。

創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的澄城網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
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應(yīng)該是讀取驅(qū)動表到內(nèi)存,而內(nèi)部表要求有有效的index也是為了降低inner access cost,而驅(qū)動表要求小,也就很好理解了。
個人觀點:當被驅(qū)動表的連接字段并沒有建立索引時,用小結(jié)果集來驅(qū)動大結(jié)果集和用大結(jié)果集來驅(qū)動小結(jié)果集效果應(yīng)該是一樣的,都需要全表掃,無非就是m*n和n*m的關(guān)系
簡朝陽在他的書中也有這么一段話:永遠用小結(jié)果集驅(qū)動大結(jié)果集……此優(yōu)化的前提條件是 通過join條件每次對各個表進行訪問的資源消耗差別不是太大。
如果資源消耗有較大的差別(一般都是因為索引的區(qū)別),就不能簡單的通過結(jié)果集的大小來判斷join語句的驅(qū)動順序,而是要通過比較循環(huán)次數(shù)和每次循環(huán)所須消耗之乘積大小來確定優(yōu)化方案了。
新聞標題:MySQL數(shù)據(jù)庫中的join的實際應(yīng)用演示
鏈接地址:http://fisionsoft.com.cn/article/cdcdchp.html


咨詢
建站咨詢
