為什麼阿里巴巴規定禁止超過三張表 join?

2022-07-12 15:21:27 字數 1719 閱讀 9728

一般,我對於這種問題,解決方案是查詢官方文件,要麼檢視我的工具書《高效能的mysql》,在本書的6.3節:重構查詢的方式裡面提到,需要考慮實際情況,看看是否有必要將乙個複雜的查詢分解成多個簡單的查詢,並不一定要把所有的工作全都移交給資料庫**換思路)!!!

其實join拆解的核心就是利用in關鍵字,這個也是出自該書,你不信,那我還是只能給你拍照(見下圖)。

計算機解決問題,要麼用空間換時間,要麼用時間換空間,此二法基本上能解決大多數疑難雜症,你現在看到的各種高大上的玩法,基本上都跟此二法沾親帶故。

比如,該問題下,阿里大佬李晨曦的回答,通過空間換時間的方案來設計表,雖然資料冗餘了,但查詢效能顯著提公升了,挺有意思。

打個比方,如果我有無限的錢,我想買個豪華別墅,想買個跑車,想買個直公升飛機,但現實是我沒錢,只能租房住,只能走路上下班。

如果資料庫的效能無限強大,多個表的join肯定是需要的,尤其是複雜的分析型(olap)查詢,甚至可能涉及10幾個表的join,但現實是大部分資料庫的效能都太弱了,尤其是涉及到多表join的查詢。給@韓飛點個贊,國內懂這個做這個的太少了,以後就靠他們了。

規範一看就是在使用mysql時的限制(這種規範實際上迫不得已的限制),做這個限制有兩個原因:一是優化器很弱,涉及多個表的查詢,往往得不到很好的查詢計畫,這塊比較複雜,感興趣的朋友可以關注我,我以後會寫文章專門介紹;二是執行器很弱,只有nested loop join,block nested loop join和index nested loop join。

1、nested loop join就是分別從兩個表讀一行資料進行兩兩對比,複雜度是n^2。

2、block nested loop join是分別從兩個表讀很多行資料,然後進行兩兩對比,複雜度也是n^2,只是少了些函式呼叫等overhead。

3、index nested loop join是從第乙個表讀一行,然後在第二個表的索引中查詢這個資料,索引是b+樹索引,複雜度可以近似認為是nlogn,比上面兩個好很多,這就是要保證關聯欄位有索引的原因。

4、 如果有hash join,就不用做這種限制了,用第乙個表(小表)建hash table,第二個表在hash table中查詢匹配的項,複雜度是n。缺點是hash table佔的記憶體可能會比較大,不過也有基於磁碟的hash join,實現起來比較複雜。

可是我確實需要兩個表裡的資料鏈結在一起啊,我們可以做個冗餘,建表的時候,就把這些列放在乙個表裡,比如一開始有student(id, name),class(id, description),student_class(student_id, class_id)三張表,這樣是符合資料庫正規化的(第一正規化,第二正規化,第三正規化,bc正規化等),沒有任何冗餘,但是馬上就不符合「程式設計規範「了,那我們可以用一張大表代替它,student_class_full(student_id, class_id, name, description),這樣name和description可能要被儲存多份,但是由於不需要join了,查詢的效能就可以提高很多了。

任何的規範都是在特定情況下的某種妥協,脫離了這個環境,就不一定成立了。

其實,很多同學問我,我是如何解決程式設計的問題?其實我就是按照以前做數學應用題的方法來解決程式設計問題,大問題拆分成小問題,小問題在書中就會有相應的例題,照貓畫虎,所有小問題都擊破了,那麼,大問題就迎刃而解了,這便是所謂的不攻自破。

其實,你遇到的問題,90%都能通過搜尋引擎解決,而你非得要做伸手黨,哎...

為什麼阿里巴巴要禁用Executors建立執行緒池?

管理一組工作執行緒。通過執行緒池復用執行緒有以下幾點優點 根據返回的物件型別建立執行緒池可以分為三類 因為這些建立執行緒池的靜態方法都是返回threadpoolexecutor物件,和我們手動建立threadpoolexecutor物件的區別就是我們不需要自己傳建構函式的引數。threadpoole...

為什麼阿里巴巴的企業Logo是它?

1999年阿里巴巴早期創業時,由18個創始人之一的盛一飛設計的笑臉logo成為了永恆的經典。阿里巴巴的英文名是從 a 開始,由 a 結束,象徵著阿里人的追求 堅持和有始有終。而 a 本身也是網際網路標誌性的 的心臟。在盛一飛的眼中,這個由 a 構成的笑臉代表了客戶滿意的微笑,他希望這個logo 能夠...

阿里巴巴為什麼不再談「去IOE」了?

誰都知道 去ioe 的概念是阿里巴巴2008年提出的。當初指的是ibm小型機 oracle資料庫 emc的高階儲存,後來,隨著雲計算大潮的滲透,全球稜鏡門事件的發酵,中國自主創新與開放合作的深入 逐漸演化為中國的外企巨頭境遇生變,紛紛開始選擇新的路徑 可為什麼這個時候,阿里巴巴不再談 去ioe 了?...