国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一篇文章搞懂MySQL的分庫分表,從拆分場景、目標評估、拆分方案、不停機遷移、一致性補償?shù)确矫嬖敿氷U述MySQL數(shù)據(jù)庫的分庫分表方案

這篇具有很好參考價值的文章主要介紹了一篇文章搞懂MySQL的分庫分表,從拆分場景、目標評估、拆分方案、不停機遷移、一致性補償?shù)确矫嬖敿氷U述MySQL數(shù)據(jù)庫的分庫分表方案。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

導航:

【Java筆記+踩坑匯總】Java基礎+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外賣/黑馬旅游/谷粒商城/學成在線+設計模式+面試題匯總+性能調(diào)優(yōu)/架構設計+源碼-CSDN博客

目錄

一、分庫分表基本概念

二、分庫分表的場景和核心思想

三、分庫分表具體步驟

3.1 分庫分表的原則:能不分就不分

3.2 目標評估

3.3 表拆分

3.3.1 業(yè)務層面拆分

3.3.1.1 混合業(yè)務拆分

3.3.1.2 冷熱分離

3.3.2 數(shù)據(jù)層面拆分

3.4 分表字段(sharding_key)選擇

3.5 代碼改造

3.6 數(shù)據(jù)遷移

3.6.1 增量同步

3.6.2 全量同步

3.7 數(shù)據(jù)一致性校驗和補償

3.8 灰度切讀

3.9 停舊庫、寫新庫


一、分庫分表基本概念

只分表:

單表數(shù)據(jù)量大,讀寫出現(xiàn)瓶頸,這個表所在的庫還可以支撐未來幾年的增長。

只分庫:

整個數(shù)據(jù)庫讀寫出現(xiàn)性能瓶頸,例如數(shù)據(jù)庫連接數(shù)被打滿了(MySQL最大連接數(shù)默認150),或者并發(fā)量太大導致單個數(shù)據(jù)庫已經(jīng)無法滿足日常的讀寫需求,就需要將整個庫拆開。

分庫分表:

單表數(shù)據(jù)量大,所在庫也出現(xiàn)性能瓶頸,就要既分庫又分表。

垂直拆分:

把字段分開。例如spu表的pic字段特別長,建議把這個pic字段拆到另一個表(同庫b不同庫。

水平拆分:

把記錄分開。例如表數(shù)據(jù)量到達百萬,我們拆成四張20萬的表。

mysql 無感分表,Java學習路線,架構設計/性能調(diào)優(yōu),mysql,數(shù)據(jù)庫,分庫分表,Java,springcloud

二、分庫分表的場景和核心思想

一般情況下,單表數(shù)據(jù)量到達千萬級別,就可以考慮分庫分表了。

具體是否需要分庫分表還是要看具體的業(yè)務場景,例如流水表、記錄表,數(shù)據(jù)量非常容易到達千萬級、億萬級,需要在設計數(shù)據(jù)庫表的階段就進行分表,還有一些表雖然數(shù)據(jù)量只有幾百萬,但字段非常多,而且有很多text、blog格式的字段,查詢性能也會很慢,可以考慮分庫分表。

數(shù)據(jù)量增長情況 數(shù)據(jù)表類型 優(yōu)化核心思想
數(shù)據(jù)量為千萬級,是一個相對穩(wěn)定的數(shù)據(jù)量 狀態(tài)表 能不拆就不拆讀需求水平擴展
數(shù)據(jù)量為千萬級,可能達到億級或者更高 流水表 業(yè)務拆分,面向分布式存儲設計
數(shù)據(jù)量為千萬級,可能達到億級或者更高 流水表 設計數(shù)據(jù)統(tǒng)計需求存儲的分布式擴展
數(shù)據(jù)量為千萬級,不應該有這么多的數(shù)據(jù) 配置表 小而簡,避免大一統(tǒng)

三、分庫分表具體步驟

3.1 分庫分表的原則:能不分就不分

1.優(yōu)先MySQL調(diào)優(yōu),能不分就不分。

數(shù)據(jù)量能穩(wěn)定在千萬級,近幾年不會到達億級,其實是不用著急拆的,先嘗試MySQL調(diào)優(yōu),優(yōu)化讀寫性能。只有在MySQL調(diào)優(yōu)已經(jīng)無法解決慢查詢問題時,才可以考慮分庫分表。

MySQL調(diào)優(yōu):

【MySQL調(diào)優(yōu)】如何進行MySQL調(diào)優(yōu)?一篇文章就夠了!-CSDN博客

2.分片數(shù)量盡量少。

分片盡量均勻分布在多個 DataHost 上,因為一個查詢 SQL 跨分片越多,則總體性能越差,雖然要好于所有數(shù)據(jù)在一個分片的結果,只在必要的時候進行擴容,增加分片數(shù)量。

3.不要一個事務里跨越多個分片查詢

盡量不要在一個事務中的 SQL 跨越多個分片,分布式事務一直是個不好處理的問題。

3.2 目標評估

評估需要拆分成幾個庫、幾個表。

舉例:

當前20億,5年后評估為100億。分幾個表? 分幾個庫?解答:一個合理的答案,1024個表,16個庫按1024個表算,拆分完單表200萬,5年后為1000萬.1024個表*200w≈100億

3.3 表拆分

3.3.1 業(yè)務層面拆分

3.3.1.1 混合業(yè)務拆分

混合業(yè)務拆分:將混合業(yè)務拆分為獨立業(yè)務。

業(yè)務場景舉例:

  • 電商網(wǎng)站:一個典型的混合業(yè)務,包含用戶信息、訂單信息、商品信息等。可以將用戶信息、訂單信息和商品信息分別拆分到不同的庫或表中,以減少數(shù)據(jù)冗余并提高訪問效率。

  • 社交媒體平臺:包含用戶信息、好友關系、動態(tài)信息等。可以將用戶信息和好友關系分離存儲,以便更好地支持好友關系的查詢和更新。

  • 在線游戲:涉及角色信息、道具信息、戰(zhàn)斗日志等??梢詫⒔巧畔⒑偷谰咝畔⒉鸱值讲煌谋碇?,以提升查詢效率,并將戰(zhàn)斗日志存儲到日志數(shù)據(jù)庫中,以減輕主數(shù)據(jù)庫的負載。

  • 物流系統(tǒng):包含訂單信息、配送信息、運輸信息等??梢詫⒂唵涡畔?、配送信息和運輸信息分別拆分到不同的表中,以便更好地支持訂單的查詢和跟蹤。

3.3.1.2 冷熱分離

冷熱分離:將常用的“熱”數(shù)據(jù)和不常使用的“冷”數(shù)據(jù)分開存儲。即在處理數(shù)據(jù)時將數(shù)據(jù)庫分成冷庫和熱庫,冷庫存放那些走到終態(tài)、不常使用的數(shù)據(jù),熱庫存放還需要修改、經(jīng)常使用的數(shù)據(jù)。

什么情況下可以使用冷熱分離?

  1. 數(shù)據(jù)走到終態(tài)后只有讀沒有寫的需求。例如訂單完結后基本只會讀不會改。
  2. 用戶能接受新舊數(shù)據(jù)分開查詢。比如有些電商網(wǎng)站默認只讓查詢3個月內(nèi)的訂單,如果要查詢3個月前的訂單,還需要訪問其他的頁面。

業(yè)務場景舉例:

  • 郵件系統(tǒng):郵件系統(tǒng)中最近郵件是用戶經(jīng)常訪問和修改的,三個月前的郵件或已歸檔的郵件不經(jīng)常訪問的??梢詫⒂脩舻氖占?、發(fā)件箱里最近三個月的郵件放在一個庫里(熱庫),之前的郵件或者已讀的郵件放在另一個庫里(冷酷)。

  • 日志系統(tǒng):在大型應用中,日志數(shù)據(jù)是非常龐大的,但并不是所有日志都需要經(jīng)常查詢或分析??梢詫⒆罱欢螘r間的活動日志存放在熱庫中,而將過去的歷史日志存放在冷庫中,以減輕熱庫的負載和優(yōu)化查詢性能。

  • 社交媒體平臺:社交媒體平臺上的用戶數(shù)據(jù)量通常很大,但是只有少部分用戶是活躍的,并且只有少量用戶的數(shù)據(jù)會頻繁訪問和更新,如果所有用戶都放在同一個庫里,勢必會影響活躍用戶的查詢效率??梢詫⒒钴S用戶的個人信息、好友關系等存放在熱庫中,而將不活躍用戶的數(shù)據(jù)存放在冷庫中,以提升熱庫的性能和減少冷庫的存儲成本。

  • 電商平臺:電商平臺上的商品數(shù)據(jù)也可以進行冷熱分離。熱庫中存放熱門商品的基本信息和庫存等,以支持頻繁的查詢和更新操作,而將不活躍或下架的商品信息存放在冷庫中,以減少熱庫的負載和優(yōu)化查詢性能。

  • 客服工單:在我們?nèi)粘2僮鲿r,經(jīng)常能看到查詢歷史工單時會有個“近三個月工單”的選項,實際業(yè)務場景中,用戶基本只會關注近三個月工單,而且這些工單也會經(jīng)常需要進行修改、刪除的操作,而對很早期的歷史訂單基本就沒有修改、刪除的需求,只有少量的查詢需求。

3.3.2 數(shù)據(jù)層面拆分

  • 按日期拆分:這種使用方式比較普遍,尤其是按照日期維度的拆分,其實在程序?qū)用娴母膭雍苄?,但是擴展性方面的收益很大。

    • 日維度拆分,如test_20191021
    • 月維度拆分,如test_201910
    • 年維度拆分,如test_2019
  • 按主鍵范圍拆分:例如【1,200w】主鍵在一個表,【200w,400w】主鍵在一個表。優(yōu)點是單表數(shù)據(jù)量可控。缺點是流量無法分攤,寫操作集中在最后面的表。

  • 中間表映射:表隨意拆分,引入中間表記錄查詢的字段值,以及它對應的數(shù)據(jù)在哪個表里。優(yōu)點是靈活。確定是引入中間表讓流程變復雜。

  • hash切分:sharding_key%N。優(yōu)點是數(shù)據(jù)分片均勻,流量分攤。缺點是擴容需要遷移數(shù)據(jù),跨節(jié)點查詢問題。

  • 按分區(qū)拆分:hash,range等方式。不建議,因為數(shù)據(jù)其實難以實現(xiàn)水平擴展。

3.4 分表字段(sharding_key)選擇

選擇最佳的分表字段是一個需要仔細考慮的問題。最佳的分表字段應該是能夠讓數(shù)據(jù)分布均勻、頻繁查詢的字段以及不可變的字段。通過選擇最佳的分表字段,可以提高系統(tǒng)的性能和查詢效率。

常用字段:

  • 主鍵ID:頻繁查詢并且唯一,非常適合作分表字段。例如,在用戶表中,用戶ID作為分表字段是一個不錯的選擇,因為用戶ID是唯一的,而且在查詢用戶信息時經(jīng)常會用到。

  • 時間字段:如果業(yè)務需要按時間范圍查詢數(shù)據(jù),那么選擇時間字段作為分表字段是合理的。例如,在日志表中,可以選擇時間戳字段作為分表字段,以便按天、按月或按年分割數(shù)據(jù),方便查詢和維護。

  • 地理信息字段:如果業(yè)務需要按地區(qū)查詢數(shù)據(jù),那么選擇地理信息字段作為分表字段是合適的。例如,在訂單表中,可以選擇訂單地區(qū)字段作為分表字段,以便將訂單數(shù)據(jù)按地區(qū)進行拆分,方便查詢和擴展。

  • 關聯(lián)字段:如果業(yè)務需要頻繁進行關聯(lián)查詢,那么選擇訂單號等關聯(lián)字段作為分表字段。例如,在訂單表中,可以選擇訂單號作為分表字段,因為訂單號唯一且包含業(yè)務信息,并且日常查詢、關聯(lián)查詢都是根據(jù)訂單號查詢的,很少根據(jù)id查詢,方便查詢和維護。

選擇分表字段的原則:

1. 數(shù)據(jù)分布均勻

最佳的分表字段應該是能夠讓數(shù)據(jù)分布均勻的字段,這樣可以避免某個表的數(shù)據(jù)過多,導致查詢效率降低。在用戶表中,如果以地區(qū)作為分表字段,可能會導致某些地區(qū)的數(shù)據(jù)過多,而某些地區(qū)的數(shù)據(jù)過少。

2. 頻繁查詢的字段

盡量選擇查詢頻率最高的字段(例如主鍵id),然后根據(jù)表拆分方式選擇字段。在一個訂單表中,如果經(jīng)常需要根據(jù)用戶ID查詢訂單信息,那么以用戶ID作為分表字段是一個不錯的選擇。

3. 不可變字段

最佳的分表字段還應該是不可變的字段,這樣可以避免在數(shù)據(jù)遷移時出現(xiàn)問題。在一個商品表中,如果選擇以商品名稱作為分表字段,那么當商品名稱發(fā)生變化時,就需要將數(shù)據(jù)移動到不同的表中,這樣會增加系統(tǒng)的復雜度。

3.5 代碼改造

修改代碼里的查詢、更新語句,以便讓其適應分庫分表后的情況。

查詢語句改造:

  • 單庫查詢改為跨庫查詢:對于需要查詢的字段,需要明確指定查詢的庫和表,以避免查詢到錯誤的數(shù)據(jù)。例如,原來的查詢語句 “SELECT * FROM users WHERE id = 1” 可以修改為 “SELECT * FROM db.table_name WHERE id = 1”,其中 db 為目標數(shù)據(jù)庫,table_name 為目標表。

  • 單表查詢改為跨表查詢:例如投訴記錄表根據(jù)哈希取余的方式分成10個表,如果id%1=0,則查0號表complaint_records_0。

3.6 數(shù)據(jù)遷移

最簡單的就是停機遷移,復雜點的就是不停機遷移,要考慮增量同步和全量同步的問題。

3.6.1 增量同步

增量同步:老庫遷移到新庫期間,增刪改命令的落庫不能出錯

  • 同步雙寫:同步寫新庫和老庫;
  • 異步雙寫(推薦): 寫老庫,監(jiān)聽binlog異步同步到新庫
  • 中間件同步工具:通過一定的規(guī)則將數(shù)據(jù)同步到目標庫表

3.6.2 全量同步

全量同步:老庫到新庫的數(shù)據(jù)遷移,要控制好遷移效率,解決增量數(shù)據(jù)的一致性。

  • 定時任務查老庫寫新庫
  • 使用中間件遷移數(shù)據(jù),例如Dbmate、Apache NiFi、Ladder、Phinx、Flyway、TiDB等。

3.7 數(shù)據(jù)一致性校驗和補償

假設采用異步雙寫方案,在遷移完成后,逐條對比新老庫數(shù)據(jù),一致則跳過,不一致則補償:

  • 新庫存在,老庫不存在:新庫刪除數(shù)據(jù)
  • 新庫不存在,老庫存在:新庫插入數(shù)據(jù)
  • 新庫存在、老庫存在:比較所有字段,不一致則將新庫更新為老庫數(shù)據(jù)

3.8 灰度切讀

灰度發(fā)布:指黑(舊版本)與白(新版本)之間,讓一些用戶繼續(xù)用舊版本,一些用戶開始用新版本,如果用戶對新版本沒什么意見,就逐步把所有用戶遷移到新版本,實現(xiàn)平滑過渡發(fā)布。

原則:

  • 有問題及時切回老庫
  • 灰度放量先慢后快,每次放量觀察一段時間
  • 支持靈活的規(guī)則:門店維度灰度、百 (萬)分比灰度

3.9 停舊庫、寫新庫

下線老庫,用新庫讀寫。文章來源地址http://www.zghlxwxcb.cn/news/detail-770812.html

到了這里,關于一篇文章搞懂MySQL的分庫分表,從拆分場景、目標評估、拆分方案、不停機遷移、一致性補償?shù)确矫嬖敿氷U述MySQL數(shù)據(jù)庫的分庫分表方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 搞懂TVS管,有這篇文章就夠了

    摘要:本文主要介紹TVS的工作原理、關鍵參數(shù)和選型。 TVS(Transient Voltage Suppressors,瞬態(tài)電壓抑制器)又稱雪崩擊穿二極管,是一種高效電路保護器件,主要是保護電路不受瞬態(tài)高壓尖峰脈沖(靜電或雷擊浪涌)的沖擊。 TVS是采用半導體工藝制成的單個PN結或多個PN結集成的器件,

    2023年04月08日
    瀏覽(30)
  • 一篇文章帶你搞懂前端Cookie

    一篇文章帶你搞懂前端Cookie

    瀏覽器Cookie相信各位點進這篇文章的小伙伴應該不陌生了,它是前端領域中一個非常重要的內(nèi)容,當然也是面試的一個考點,不知道各位小伙伴是否真正掌握了Cookie呢?當然沒有掌握也是沒有關系的,可以跟著小編的腳步一起來學習一下前端Cookie,沒有熟練掌握的小伙伴看完這

    2024年02月04日
    瀏覽(31)
  • 一篇文章帶你搞懂stm32工程文件

    一篇文章帶你搞懂stm32工程文件

    本文以stm32f4為例,講解stm32標準庫工程中各個文件的作用,學藝不精,如有錯誤,望大家私信或評論指出。 先看思維導圖 startup_stm32f427xx.s? 該文件是stm32的啟動文件,由匯編語言編寫,主要是做stm32上電時的配置設置(如堆棧指針,時鐘數(shù))并跳轉(zhuǎn)到main函數(shù)中,執(zhí)行c代碼。

    2024年02月21日
    瀏覽(34)
  • 一篇文章搞懂前端sso需要做什么

    一篇文章搞懂前端sso需要做什么

    父域 Cookie 認證中心 LocalStorage 跨域 一般情況下,用戶的登錄狀態(tài)是記錄在 Session 中的,要實現(xiàn)共享登錄狀態(tài),就要先共享 Session,但是由于不同的應用系統(tǒng)有著不同的域名,盡管 Session 共享了,但是由于 SessionId 是往往保存在瀏覽器 Cookie 中的,因此存在作用域的限制,無法

    2024年02月20日
    瀏覽(31)
  • 什么是區(qū)塊鏈?一篇文章搞懂區(qū)塊鏈本質(zhì)

    鑒于我對區(qū)塊鏈的關注,以及很多關注我的朋友們,并不是很清楚區(qū)塊鏈的本質(zhì)和潛力點,所以今天在地鐵里疏離了一下,并分享給大家。 你見過錢嗎?我相信你是沒見過真正的錢的。 這是錢嗎? 這是“鈔票”,而不是錢!這不是摳字眼,且聽我細細道來。 別人管你借錢的

    2024年01月22日
    瀏覽(21)
  • 一篇文章讓你搞懂自定義類型-----結構體

    一篇文章讓你搞懂自定義類型-----結構體

    結構是一些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量 例如描述一個學生 在聲明結構的時候,可以不完全的聲明 比如 上面的兩個結構在聲明的時候省略掉了結構體標簽(tag) 那么問題來了 警告: 編譯器會把上面的兩個聲明當成完全不同的兩個

    2024年02月16日
    瀏覽(30)
  • Unity/C#------委托與事件(一篇文章徹底搞懂...)

    Unity/C#------委托與事件(一篇文章徹底搞懂...)

    ? ? ? ? 所有的代碼語言創(chuàng)造者母語都是英語,我們從英語翻譯到中文的過程中難免會存在一些不太能還原本意的詞,比如我之前一直不理解構造函數(shù)和析構函數(shù),只知道這倆貨作用相反,直到我看到了它的英文意思,Construstor/Distructor,我才徹底理解了他們的作用。 ? ? ?

    2024年02月06日
    瀏覽(22)
  • 一篇文章帶你搞懂GIT、Github、Gitee

    一篇文章帶你搞懂GIT、Github、Gitee

    本文介紹了GIt,GitHub,Gitee的使用,與IDEA的Git配置,跟著文章來做你很快就能學會操作Git,利用其進行版本控制與代碼托管,學習Git的使用、Git常用命令、Git分支,分支是團隊協(xié)作的基礎,介紹了團隊內(nèi),外協(xié)作和Github遠程倉庫的操作、使用IDEA中的Git、IDEA中GIt的使用、在I

    2023年04月19日
    瀏覽(26)
  • 還沒搞懂重寫和重載嗎?這篇文章可以幫助你

    首先,會大致介紹一下什么叫做向上轉(zhuǎn)型,方便后續(xù)的理解 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 向上轉(zhuǎn)型是Java的一個多態(tài)性的表現(xiàn)形式。指的是一個子類的對象賦值給父類類型的引用變量。換句話說,它是將一個對象轉(zhuǎn)換為它的父類類型。 在上述示例中,

    2024年02月06日
    瀏覽(24)
  • 一篇文章搞懂數(shù)據(jù)倉庫:常用ETL工具、方法(1)

    一篇文章搞懂數(shù)據(jù)倉庫:常用ETL工具、方法(1)

    ETL ,是英文Extract-Transform-Load的縮寫,用來描述將數(shù)據(jù)從來源端經(jīng)過抽?。╡xtract)、轉(zhuǎn)換(transform)、加載(load)至目的端的過程,是數(shù)據(jù)倉庫的生命線。 **抽取( Extract )**主要是針對各個業(yè)務系統(tǒng)及不同服務器的分散數(shù)據(jù),充分理解數(shù)據(jù)定義后,規(guī)劃需要的數(shù)據(jù)源及數(shù)據(jù)

    2024年04月17日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包