面試官靈魂拷問:為什麼SQL語句不要過多的join?

麥聰軟件 發佈 2024-04-06T14:54:17.999745+00:00

「為什麼SQL語句不要過多的join?」最近有個同學跑來問我如何回答面試官的這個問題,我說你直接懟他「為何MySQL如此垃圾,連join都不能寫?!」哈哈哈,開個玩笑,講個故事開始今天的文章。

「為什麼sql語句不要過多的join?」

最近有個同學跑來問我如何回答面試官的這個問題,我說你直接懟他「為何MySQL如此垃圾,連join都不能寫?!」

哈哈哈,開個玩笑,講個故事開始今天的文章。

很久以前,有個公司真的有這麼一個關係型資料庫,出於某種未知原因,就是不能過多join,你敢這麼做,特別是在應用程式里這麼寫,資料庫就敢給你罷工。

當時,為了完成這個項目,老一輩先驅們達成了幾個重要的共識:

  1. 進度為大,沒時間再回頭探究資料庫設計了;
  2. 這個功能可以在應用層面實現,多搞幾個中間查詢就是了,不打緊;
  3. 乾脆別的地方也不要 join 了,沒功夫測試,都改成 1 那樣比較穩妥;
  4. 未來我們會招專職 DBA ,到了那一天,一切都會好起來的。

然後,項目上線,取得了重大成功。

項目經理很激動,認真的對項目進行了復盤,同時把大量的「項目經驗」收入了「組織過程資產」里,自然也包括技術團隊的這個「不要 join」的重要經驗!

鑽石恆久遠,一顆永流傳~祖訓終於傳到面試官這兒,被你遇上了。

其實:無腦的不允許(outer)join是不對的。

一般來說,需要減少join的場景是數據量單機盛不下,需要使用分布式資料庫,這類應用一般來說並發也會比較高。

這類場景里,真正決定能不能(outer)join的,是這個sql語句能不能謂詞下推,以及網絡傳輸成本高低(一些join會引起數據shuffle,網絡傳輸成本急劇升高)。

不管你在資料庫里join,還是單表查了在應用內存里join,join算法的複雜度總是存在的,區別可能是減輕了資料庫的壓力,並且應用層一般無狀態,可以平滑擴容。

另外,如果想減少join,設計上就要考慮更多冗餘,而這些冗餘欄位,資料庫優化器是不知道的,資料庫的優化只能保證邏輯上是等價的,這些業務上等價但邏輯上可能不等價的東西,資料庫幾乎無法優化。

但考慮到網絡傳輸成本,有些時候,不join是不行的,比如數據匯總;比如有外連接情況下,兩側都有篩選條件的分頁查詢。如果你不在資料庫join,還要保證結果正確性,那可能就得把幾億,幾十億,幾百億的數據都查到應用端,這是網絡不能承受的。

這個事情展開來講非常複雜。一般面試官可能也只是想看看你腦子裡有沒有這個概念而已。甚至他自己可能也不明白為什麼不用join。

至於很多人說的mysql垃圾,好吧,mysql確實垃圾,但這根本不是問題的癥結。

如果你的數據量單機就能玩的轉,那大可不必做這種過度設計,放心join就好。

但放心join之前,別忘了給內表的連接欄位加索引,資料庫最通用也最基礎的join算法是nested loop join,說白了就是for循環套娃。

假設經過謂詞下推,外表有m條數據,內表有n條數據,那麼它join的時間複雜度是O(mn),如果內表的關聯列上有索引,那就會降到O(mlogn),在現實中可能就是毫秒級和分鐘級的區別。

說白了,不管join與否,都是兩害相權取其輕。

最後給大家推薦一款最近發現的好用免費SQL工具:SQL Studio。

(1)免費。(誰不喜歡白嫖呢?)

(2)免費的基礎上支持幾乎所有主流資料庫,不僅有MySQL、Oracel、PostgresSQL等國外資料庫,還支持武漢達夢、人大金倉等國產資料庫。

(3)突出亮點:Web版工具——一次部署,團隊成員都能使用,占用的硬體資源都在伺服器上;只要有可登錄的軟體連結和帳號、密碼,任意設備隨時可用這款工具:省去了繁瑣的工具安裝配置、升級過程。(對於團隊協作和教學場景簡直不要太友好)

(4)亮點延伸:用戶管理——SQL Studio只有管理員可以新建帳號、也只有管理員‬可以‬增加‬和‬刪除‬數據源‬,這樣避免了許多安全問題。

(5)性能穩定且可圈可點:

a.可視化管理——支持圖形化界面對資料庫、表進行管理;支持直接修改表結構、表數據等,還能顯示操作對應的SQL語句。

b.寫sql支持智能提示:可以根據用戶輸入的字符及其語意提示表名等信息。

c.每次執行的SQL語句都會保存在主界面的「歷史查詢」中,而且找到對應語句可以直接復用。

d.經常需要用到的SQL語句也可以直接保存在主界面「保存的查詢」中,不用再從電腦本地導入,而且能直接修改、複製、刪除。

e.除了「歷史查詢」、「保存的查詢」還有「歷史導出」功能,每一次下載數據都會被記錄,保證了工具完整的審計功能。

f.超強的數據導入、導出能力:近700萬行數據導出只需20多秒,比Navicat還快兩倍。

g.穩定性好:展開資料庫中一萬張表,絲毫不卡頓。SQL編輯框支持注釋,有注釋也能很好地執行語句,不出bug穩定性強。

h.一鍵批量執行:單擊執行編輯框內所有SQL語句,方便大家進行刷庫等操作。

i.一鍵解釋執行:單擊即可幫助大家分析sql語句的性能,輔助優化。

j.結果欄支持調整每頁展示多少條數據、且支持改變排序和全屏,看數據更方便。

k.資料庫列表、結果欄、歷史查詢、保存查詢都支持搜索定位。

好啦,今天的分享就到這裡了。如果面試官問你:為什麼SQL語句不要過多的join?你會怎麼回答呢?SQL Studio大家覺得好用嗎?

關鍵字: