日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
為什么阿里巴巴禁止數(shù)據(jù)庫(kù)中做多表join?

?阿里出過(guò)一個(gè)《Java開(kāi)發(fā)手冊(cè)》,上面有一條規(guī)約是禁止超過(guò)三張表的join。

創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供正藍(lán)企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、HTML5建站、小程序制作等業(yè)務(wù)。10年已為正藍(lán)眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

而實(shí)際操作過(guò)程中,我們平時(shí)確實(shí)在SQL中寫(xiě)JOIN也比較少,兩張表JOIN有的時(shí)候也有,多張表的JOIN在離線數(shù)據(jù)分析的時(shí)候很多,但是在線系統(tǒng)確實(shí)很少。經(jīng)常有人問(wèn)我為什么?

其實(shí)最主要的原因就是join的效率比較低。

MySQL是使用了嵌套循環(huán)(Nested-Loop Join)的方式來(lái)實(shí)現(xiàn)關(guān)聯(lián)查詢的,簡(jiǎn)單點(diǎn)說(shuō)就是要通過(guò)兩層循環(huán),用第一張表做外循環(huán),第二張表做內(nèi)循環(huán),外循環(huán)的每一條記錄跟內(nèi)循環(huán)中的記錄作比較,符合條件的就輸出。

而具體到算法實(shí)現(xiàn)上主要有simple nested loop,block nested loop和index nested loop這三種。

而且這三種的效率都沒(méi)有特別高。

首先,最差的算法就是simple nested loop,他的做法簡(jiǎn)單粗暴,就是全量掃描連接兩張表進(jìn)行數(shù)據(jù)的兩兩對(duì)比,所以他的復(fù)雜度可以認(rèn)為是O(n^2)

好一點(diǎn)的算法是index nested loop,當(dāng)Inner Loop的表用到字段有索引的話,可以用到索引進(jìn)行查詢數(shù)據(jù),因?yàn)樗饕荁+樹(shù)的,復(fù)雜度可以近似認(rèn)為是O(nlogn)

那block nested loop這種算法,其實(shí)是引入了一個(gè)Buffer,會(huì)提前把外循環(huán)的一部分結(jié)果提前放到多個(gè)JOIN BUFFER中,然后內(nèi)循環(huán)的每一行都和多個(gè)buffer中的所有數(shù)據(jù)作比較,從而減少內(nèi)循環(huán)的次數(shù)。他的復(fù)雜度是O(M*N),這里的M是buffer的個(gè)數(shù)。

所以,雖然MySQL已經(jīng)盡可能的在優(yōu)化了,但是這幾種算法復(fù)雜度都還是挺高的,這也是為什么不建議在數(shù)據(jù)庫(kù)中多表JOIN的原因。隨著表越多,表中的數(shù)據(jù)量越多,JOIN的效率會(huì)呈指數(shù)級(jí)下降。

如果不能通過(guò)數(shù)據(jù)庫(kù)做關(guān)聯(lián)查詢,那么需要查詢多表的數(shù)據(jù)的時(shí)候要怎么做呢?

主要有兩種做法:

1、在內(nèi)存中自己做關(guān)聯(lián),即先從數(shù)據(jù)庫(kù)中把數(shù)據(jù)查出來(lái)之后,我們?cè)诖a中再進(jìn)行二次查詢,然后再進(jìn)行關(guān)聯(lián)。

2、數(shù)據(jù)冗余,那就是把一些重要的數(shù)據(jù)在表中做冗余,這樣就可以避免關(guān)聯(lián)查詢了。

其實(shí)數(shù)據(jù)冗余是互聯(lián)網(wǎng)業(yè)務(wù)中比較常見(jiàn)的做法,其實(shí)本質(zhì)上是軟件開(kāi)發(fā)中一個(gè)比較典型的方案,那就是"用空間換時(shí)間",通過(guò)做一些數(shù)據(jù)冗余,來(lái)提升查詢速度。

在互聯(lián)網(wǎng)業(yè)務(wù)中,比較典型的就是數(shù)據(jù)量大,并發(fā)高,并且通常查詢的頻率要遠(yuǎn)高于寫(xiě)入的頻率,所以適當(dāng)?shù)淖鲆恍┓捶妒剑ㄟ^(guò)做一些字段的冗余,可以提升查詢性能,降低響應(yīng)時(shí)長(zhǎng),從而提升并發(fā)度。?


文章名稱(chēng):為什么阿里巴巴禁止數(shù)據(jù)庫(kù)中做多表join?
文章URL:http://www.5511xx.com/article/ccedpjd.html