自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么阿里巴巴禁止數(shù)據(jù)庫中做多表join?

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

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

圖片

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

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

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

圖片

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

而且這三種的效率都沒有特別高。

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

好一點的算法是index nested loop,當Inner Loop的表用到字段有索引的話,可以用到索引進行查詢數(shù)據(jù),因為索引是B+樹的,復雜度可以近似認為是O(nlogn)

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

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

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

主要有兩種做法:

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

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

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

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

責任編輯:武曉燕 來源: Hollis
相關(guān)推薦

2020-09-22 11:40:53

BigDecimalequalsJava

2020-09-08 16:25:18

Apache BeancopyJava

2020-07-30 12:16:33

阿里巴巴Apache對象

2018-10-16 15:34:17

阿里巴巴Apache Flin大數(shù)據(jù)

2025-04-17 08:47:23

2013-08-22 09:26:38

去IOE王堅

2021-03-02 08:01:15

MySQL數(shù)據(jù)庫數(shù)據(jù)庫加密

2019-01-29 15:25:11

阿里巴巴數(shù)據(jù)庫分庫分表

2023-04-03 07:03:51

阿里巴巴List元素

2016-09-21 20:28:55

阿里巴巴IOE

2020-09-14 09:47:56

Java開發(fā)類型

2021-09-17 06:28:20

JOIN阿里Java

2019-03-04 09:22:52

阿里巴巴foreach Java

2019-06-26 07:54:53

ArrayListsubList源碼

2021-08-04 17:20:30

阿里巴巴AsyncJava

2022-03-14 09:41:10

POJO類型系統(tǒng)

2017-12-07 15:07:28

阿里巴巴數(shù)據(jù)庫技術(shù)架構(gòu)演進

2019-09-04 11:02:54

繼承層次組合

2021-10-11 09:32:40

包裝類型屬性

2022-08-30 16:38:30

阿里巴巴JavaLog4j
點贊
收藏

51CTO技術(shù)棧公眾號