[MySQL] 分庫分表需要考慮的問題


隨着業務的增長,一般的公司都會經歷一個從單庫單表到分庫分表的過程 , 需要考慮以下要素判斷是否開始分庫分表

1. 如果mysql單庫的QPS超過1000就要考慮分庫了 , 一般根據業務進行分庫

目前新浪郵箱的主庫是sinanet  各種輔助庫 userservice客服系統  sinastore 文件存儲庫 entsales 銷售系統庫

 

2. 單表的數據量非常大時 , 需要考慮分表 , 超過1000萬就要考慮了 , 因為此時b+樹索引的高度是3-5左右

 如果有單字段特別大 , 就要把該字段獨立出來 ,這就是垂直分表 , 遵循冷熱拆分 , 大小拆分

這里基本在設計的時候就已經考慮好了 , 一般不會出現這種情況

 

如果是數據量特別大 , 就要結合業務需求和產品特性 , 選擇合適的拆分算法

如何切分?
a:哈希取模算法 hash(id)/NUM,
本表的id是數據庫auto_incr id,hash拆分后數據分散是特別均勻的,但是后面的NUM設置沒有經驗值,只能依靠人工來計算; max_row/day_incr= year ,保證能扛住近四年的數據增量。
考慮到后續擴展表的數據時,數據遷移會比較難做。

新浪郵箱的用戶表是根據默認域郵箱hash取模進行的拆分


b:一致性hash算法
為了保證后續遷移數據影響面較小,建議使用一致性hash算法。

新浪郵箱的訂單表是根據一致性hash算法根據 , 不同值的范圍大小選擇存儲表節點


c:range(timestamp)
具有天然的時間字段,非常好拆分,具有很好的擴展性。
目前查詢都是帶時間戳的,所以會出現表的訪問冷熱不均。但同時也避免了跨節點join等問題

新浪郵箱用戶的日志表是根據月份加哈希拆分了 1024張表

 

 如何遷移數據?

這是不可避免的問題,可以采用了實時數據雙寫,歷史數據采用腳本導入的方式,在線上數據對齊后,慢慢將流量灌到新的db上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM