談一談分表設計

[toc]

談一談分表設計

在一個可預見的,能運行比較長,數(shù)據(jù)量可能比較大的業(yè)務場景中,經(jīng)常需要分庫分表,因為單表存儲能力和查詢能力都是有上限的。一般如果業(yè)務還是要正常跑下去的話,都要進行遷移,比如遷移到能水平擴展的存儲(如tidb, mongodb等)。但是在初期,業(yè)務還沒有起量的時候或者說不能預見能起量的時候,都是采用傳統(tǒng)的分庫分表方法來解決。這篇文章只談分表。

需要分表的場景

一般來說,數(shù)據(jù)是膨脹類增長時,比如線性增長,指數(shù)增長,這些場景都需要分表。舉個例子,用戶訂單表,購買記錄流水表,收支流水記錄,發(fā)放記錄流水,操作記錄表。一個用戶的操作可能產(chǎn)生幾倍的數(shù)據(jù)增長。

分表設計的原則

  • 滿足業(yè)務的需求
  • 能保持數(shù)據(jù)不惡化

說下不惡化這個原則,也就是在業(yè)務隨著時間向前推進增長的情況下,系統(tǒng)能正常運行。

常用分表方法

  • 根據(jù)業(yè)務id做shardKey(取?;蛘遠ash, 或者某類算法)分表

  • 根據(jù)時間分表(年月日相關)

  • 分表冗余表(路由表)

前2種一般都有用到。這里說一下第三種
有時按第一種分表,數(shù)據(jù)變得難以查詢,比如訂單表,假定表結包含如下字段

orderId 訂單id
uid 用戶id
money 訂單金額
itemid 商品id

如果存儲是按照格式,會發(fā)現(xiàn),如果用戶來查詢自己的訂單,就比較難查詢。
這時需要再存儲一個對應關,簡稱路由表,按uid來分表,存儲orderId

最優(yōu)分表方法

其實沒有什么最優(yōu)方法,只有適合的才是最好的。

但是對于分表的的情況,如是數(shù)據(jù)有冷熱之分,比如只查詢最近的,一個月前的幾乎不會查詢到,則需要根據(jù)時間更佳,如果擔心分月單表壓力大,可能再根據(jù)uid來分一次,不會隨著時間,表里面的數(shù)量膨脹到最終爆炸。

數(shù)據(jù)庫分表是解決單表海量數(shù)據(jù)的查詢性能問題。

有些表是沒有冷熱之分,比如商品表,這個時候就需要分庫了,解決單庫并發(fā)訪問壓力, 一個不行,多來幾個。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容