不知道如何分庫分表,看完這篇文章,輕鬆應對工作面試

来源:https://www.cnblogs.com/yidengjiagou/archive/2022/06/18/16388553.html
-Advertisement-
Play Games

一個挺著啤酒肚,身穿格子衫,髮際線嚴重後移的中年男子,手拿著保溫杯,胳膊夾著MacBook向你走來,看樣子是架構師級別。 面試開始,直入正題。 面試官: 小伙子,看到你的簡歷上面寫了項目中有對MySQL進行分庫分表,為什麼要進行分庫分表? 我: 不知道啊!誰知道老大咋想的,反正我來的時候就已經分好了 ...


一個挺著啤酒肚,身穿格子衫,髮際線嚴重後移的中年男子,手拿著保溫杯,胳膊夾著MacBook向你走來,看樣子是架構師級別。

面試開始,直入正題。

面試官: 小伙子,看到你的簡歷上面寫了項目中有對MySQL進行分庫分表,為什麼要進行分庫分表?

我: 不知道啊!誰知道老大咋想的,反正我來的時候就已經分好了。

面試官: 嗯...,今天的面試就先到這吧,有後續面試會通知你,我送你下去。

別啊,每次都說會通知我,然後我就傻傻的回去等通知了。我是實話實說,難道讓我去訂閱一燈的文章,背誦八股文給你聽?
好吧!自古真情留不住,總是套路得人心。重來一次,我把一燈總結的八股文背誦一遍。

我: 當MySQL單表數據量過大,比如超過5千萬條的時候,讀寫性能變得很差。而且常規的優化手段已經不起作用了,比如:SQL調優、添加索引、主從複製、讀寫分離。這時候就需要用到MySQL終極優化方案 — 分庫分表。

面試官: 不錯,我該怎麼判斷項目是需要分庫還是要分表?是先分庫還是先分表?

這誰能現場總結出來?彆著急,等我看一眼一燈的八股文。

我: 有了。

  1. 當資料庫的QPS過高,資料庫連接數不足的時候,就需要分庫。
  2. 當單表數據量過大,讀寫性能較差,就需要分表。
  3. 當兩者都有的時候,就需要分庫分表。

至於先分庫還是先分表?建議先分表,如果分表能解決問題,就不需要分庫了,畢竟需要單獨伺服器資源,成本更高。

面試官: 小伙子,總結的挺全。分庫分表有哪些拆分方案呢?

我: 分庫分表有垂直拆分和水平拆分。垂直拆分又有垂直分庫、垂直分表。

垂直分庫,不同的業務拆分到不同的資料庫。

垂直分表,把長度較大或者訪問頻次較低的欄位,拆分到擴展表中。

水平分表,單表數據量過大時,按照訂單ID拆分到多張表中。

面試官: 小伙子,有點東西。都知道分庫分表好使,就沒有什麼缺點嗎?

我: 當然有,“所有命運饋贈的禮物,早已在暗中標好了價格。”分庫分錶帶來了低耦合、高性能的優點,可是缺點卻是一大堆。

垂直分庫:
不同庫多表之間無法join關聯查詢,只能通過介面聚合,複雜度直線上升。
橫跨多個資料庫導致無法使用本地事務,數據強一致性就別想了,只能引入更為複雜的分散式事務,勉強實現數據的最終一致性,可用性直線下降。

垂直分表:
本來一張表能查出來的數據,現在需要多張表join關聯查詢,這不瞎耽誤事。

水平分表:
多張表關聯查詢時,無法實現分頁、排序功能。

面試官: 分庫分錶帶來這麼多問題,你沒有沒考慮過相應的解決方案?

我怎麼可能沒有解決方案,難道我提出問題給自己挖坑?

我: 當然有考慮過,“有問題就會有答案”。

跨庫查詢問題:
採用欄位冗餘方案,比如訂單表存儲店鋪ID、店鋪名稱,就不需要再查詢商戶資料庫了。
不過這種方案要求冗餘欄位要很少變動,就算變動後,也能容忍返回舊數據。

多表分頁查詢問題:
這個處理起來就很需要技術含量了。
比如:訂單表按照訂單ID分片,(order_id % 128),分成了128張表。
Leader看了說:每張表的數據量差不多,分的很均勻,以後不要再分了。

同一個用戶的訂單散落在不同的表,用戶想查詢自己的訂單,根本無法做到分頁查詢。難道一次全部查詢該用戶的所有訂單,然後做記憶體分頁,多大的機器記憶體都讓你搞掛。
想要實現用戶訂單分頁查詢,可以採用按照用戶ID分片,(user_id % 128),這樣同一個用戶的訂單隻會存儲在一張表中,咋分頁展示都行。

沒有完美的分片方案,如果商戶想要分頁查看自己店鋪的訂單怎麼辦?
那就把訂單再冗餘存儲一份,按照店鋪ID分片,(shop_id % 128)。不過由於商戶數量較少,可以搞個非同步線程往商戶訂單分片表同步。

訂單按照用戶ID分片後,發生數據傾斜怎麼辦?
因為不同用戶的訂單量是不同的,一個愛好購物的小姐姐的訂單量抵得上幾十個老爺們。導致一張表數據幾百條,另一張表數據量千萬級,這該咋整?
做冷熱數據分離,基礎庫只存儲3個月內的訂單,其他的移動到歷史訂單庫。這個要跟產品商量好,3個月前的訂單需要單獨的查詢頁面。

跨庫事務問題:
這個問題就更複雜了。

下一個訂單需要調用多個服務,只能使用分散式事務。
分散式事務的實現非常複雜,常用的有以下幾種解決方案:
二階段提交
TCC
本地消息表
MQ事務消息
分散式事務中間件

面試官: 準備的挺全啊。訂單表分片後,肯定不能使用資料庫自增主鍵做訂單ID,因為無法全局唯一,有什麼好的解決辦法?

我: 又問到我手心裡面,我前兩天剛看完一燈寫的“雪花演算法”,我現場手寫訂單ID的生成代碼吧。

面試官: 小伙子可以啊,下一面是HR面試,有薪資要求儘管提,你一定要來我們公司上班。

總結:

關於分庫分表的所有知識點,雖然很多,但都已經總結在這張圖上了。

文章持續更新,可以微信搜一搜「 一燈架構 」第一時間閱讀更多技術乾貨。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接:http://www.zhoubotong.site/post/50.html defer語句用於延遲函數調用,每次會把一個函數壓入棧中,函數返回前再把延遲的函數取出並執行。延遲函數可以有參數: 延遲函數的參數在defer語句出現時就已確定下來(傳值的就是當前值) return先賦值(對於 ...
  • 這篇文章旨在介紹一個雙人的五子棋程式。再次重申,本人不擅長對代碼的可讀性進行優化,所以可能有些雜亂(在所難免)。 先瞅一眼效果圖: 請註意,這個棋子……是這麼圓潤立體!本程式不需任何素材圖片,完全用代碼繪製所需的圖像,因此這樣立體的棋子十分難能可貴。那麼,這究竟是如何做到的呢?別急,聽我慢慢道來。 ...
  • 學生試卷中的題目有要提交截圖的,也有要提交文件的,為了方便學生考試,允許單獨交或者嵌入Word中提交,那麼事後如何整理學生的答案?單獨提交的比較方便,直接掃描文件名匹配名字後放入指定文件夾即可。但是嵌入到Word中的圖片和文件怎麼提取出來呢? 現有如下需求:提取出一個Word文檔中所有的圖片(png ...
  • 閱讀前註意 本文所有代碼貼出來的目的是幫助大家理解,並非是要引導大家跟寫,許多環境問題文件問題沒有詳細說明,代碼也並不全面,達不到跟做的效果。建議直接閱讀全文即可,我在最後會給出詳細代碼地址,對源代碼細節更感興趣的同學可以下載參考。 性能測試:使用日誌 在c++中進行性能測試是令人頭疼的問題,我們往 ...
  • 很久沒有寫博客了, 感覺沒有學到讓我自己眼前一亮的東西,所以還在摸索當中; 不過最近在複習spring相關的內容, 特別是迴圈依賴這塊, 查詢了很多的資料, 比較有收穫, 就分享一下吧! 分為上下兩篇博客, 第一篇是複習一下spring的整體流程, 第二篇說一下迴圈依賴 提前須知: 最好自己看過sp ...
  • 學習背景 公司同事讓我提供一個簡單的 rpc 介面,然後他坐在我旁邊看著我寫,寫的過程中他不斷打斷我,比如我在代碼換行時,如果游標不在下一行行首或者這行的行尾,我就會先移動游標到行尾,再點擊回車進行換行,他這時候就會說,為什麼你不用快捷鍵直接換行,最後變成了他手把手教我如何更高效的用快捷鍵編程,之前 ...
  • 首先一些Python字元串處理的簡易常用的用法。其他的以後用到再補充。 1.去掉重覆空格 s = "hello hello hello" s = ' '.join(s.split()) 2.去掉所有回車(或其他字元或字元串) s = "hello\nhello\nhello hello\n" pri ...
  • 前言 經常聽到有朋友說,學習編程是一件非常枯燥無味的事情。其實,大家有沒有認真想過,可能是我們的學習方法不對? 比方說,你有沒有想過,可以通過打游戲來學編程?今天我想跟大家分享幾個Python小游戲,教你如何通過邊打游戲邊學編程! 1、吃金幣 沒有人沒玩過吃金幣吧,但是用python來寫一個吃金幣小 ...
一周排行
    -Advertisement-
    Play Games
  • 人臉識別技術在現代社會中扮演著越來越重要的角色,比如人臉識別門禁、人臉識別支付、甚至人臉識別網站登錄等。 最近有群友問.NET有沒有人臉識別的組件,小編查閱相關資料介紹下麵幾種.NET人臉識別組件供大家參考。 **1、Microsoft Azure Face API** 簡介:Microsoft A ...
  • # 1. 與 .NET Core 緩存的關係和差異 ABP 框架中的緩存系統核心包是 [Volo.Abp.Caching](https://www.nuget.org/packages/Volo.Abp.Caching) ,而對於分散式緩存的支持,abp 官方提供了基於 Redis 的方案,需要安裝 ...
  • 最近ET做熱更重載dll的時候,返回登陸會重新檢測新的dll,首次登錄之前已經Assembly.Load()過一次dll,第二次返回登陸再次load dll到記憶體中,Invoke執行方法的時候,異常了,有些方法執行了,有些未執行,於是查資料,看到些老資料說Assembly.Load重覆載入同名dll ...
  • 1. 擴展方法 擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對於用 C#、F# 和 Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中定義的方法沒有明顯區別 ...
  • 以前在隨筆《Winform開發框架之客戶關係管理系統(CRM)的開發總結系列1-界面功能展示 》的幾篇隨筆中介紹過基於WInform開發框架開發的CRM系統,系統的功能主要也是圍繞著客戶相關信息來進行管理的。本篇隨筆介紹在最新的《SqlSugar開發框架》中整合CRM系統模塊的功能。 ...
  • 隨著技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。 經過前幾篇文章... ...
  • [toc] 這篇文章是我之前總結的一篇文章,因為整理博客的原因,原有博客已經註銷,但這篇文章對一些讀者很有用,所以現在新瓶裝舊酒重新整理回來分享給大家。 最近一段時間生產環境頻繁出問題,每次都會生成一個hs_err_pid*.log文件,因為工作內容的原因,在此之前並沒有瞭解過相關內容,趁此機會學習 ...
  • # 前言 在上一篇文章中,給大家講解了泛型的概念、作用、使用場景,以及泛型集合、泛型介面和泛型類的用法,但受限於篇幅,並沒有把泛型的內容講解完畢。所以今天我們會繼續學習泛型方法、泛型擦除,以及通配符等的內容,希望大家繼續做好學習的準備哦。 *** 全文大約【**4600】** 字,不說廢話,只講可以 ...
  • 昨天遇到參數key大小寫不一致導致校驗簽名失敗的問題,查了很長時間才找到原因。看了一下FastJson源碼,發現JSON.toObject中轉換成對象的時候會忽略大小寫。 所以,當使用了JSON.toObject將json轉成Java對象後,再用JSON.toObject轉成json,key值就變了 ...
  • 基於java的線上商城設計與實現,線上購物平臺,校園購物商城,商品銷售平臺,基於Java的電商平臺;電商平臺,買家和賣家可以在此平臺上進行銷售和交易,節約了大量的線下時間成本,購物車的功能,校園交易平臺等等; ...