分庫分表常見算法,你學會了嗎?
作者:拔土豆的程序員
分庫分表是一種數據庫設計技術,其目的是為了提高數據庫的性能和擴展性。它通過將數據庫的表拆分到多個數據庫中來實現這一目的。
分庫分表常見算法
分庫分表分片策略選擇,主要考慮兩個原則:
- 當前業務是否真的需要分庫分表,分庫分表雖然可以減少單庫單表的數據壓力,處于一個良好的查詢響應范圍,但是帶來的問題也比較多,比如事務,數據查詢等等,所以我認為不到萬不得已,不要進行分庫分表。
- 既然已經決定了要進行分庫分表,分庫分表分片策略選擇就比較重要。
哈希取模算法
根據某一列的哈希值來拆分表,比如將用戶的 email 按照哈希值來拆分表,以達到數據分布均勻的目的。hash(字段) mod 數據庫實例數或子表數量,是最為常見的一種路由方式。
優點:
- 數據均衡:哈希拆分可以將數據均衡地分布在不同的表中,避免某一個表數據量過大,從而導致性能問題。
- 橫向擴展:當數據量增長時,可以通過增加新的表來進行橫向擴展,而不需要進行縱向擴展。
缺點:
- 就是擴容麻煩,需要重新計算每一行數據對應的哈希值。
- 不適用于歸檔:哈希拆分沒有考慮時間因素,因此無法將歷史數據歸檔到單獨的表中。
容量(時間)范圍算法
- 按照范圍拆分:根據某一列的值來拆分表,比如將 id 從 1 到 1000 的數據拆分到第一個數據庫,將 id 從 1001 到 2000 的數據拆分到第二個數據庫,依此類推。
- 時間拆分:根據時間來拆分表,比如將當月的數據拆分到當月的表中,將去年的數據拆分到去年的表中,依此類推。
優點:
- 方便進行橫向擴展:當數據量增長時,可以通過增加新的表來進行橫向擴展,而不需要進行縱向擴展。
- 規則簡單,容易理解。
- 歷史數據可以進行單獨的歸檔。
缺點:
- 數據傾斜,數據熱點可能存在于某個范圍或者時間段中,數據庫壓力分攤不均勻
范圍 + 取模算法
將范圍拆分和取模算法結合起來使用。
- 將數據按照范圍放到不同的數據庫中。
- 取模運算,將數據分配到不同的數據表中。
總結
分庫分表是一種數據庫設計技術,其目的是為了提高數據庫的性能和擴展性。它通過將數據庫的表拆分到多個數據庫中來實現這一目的。
要根據實際的業務情況進行組合,例如省、市;男、女;年齡;等等都可以作為策略。
- 增加了系統的復雜性:分庫分表會增加系統的復雜性,有時候需要額外的中間件(MyCat)來實現,并且需要在程序中額外處理分庫分表的邏輯。分頁、排序、跨節點聯合查詢等等問題。
- 降低了事務的原子性:由于分庫分表會將數據存儲在多個數據庫或表中,因此在一次事務中可能涉及多個數據庫,降低了事務的原子性。如何解決跨庫事務問題。
- 對性能的影響不確定:分庫分表并不是一定能提高性能,具體的性能提升取決于實際情況,如果沒有正確地進行分庫分表,可能會導致性能下降。
- 需要進行數據遷移:如果需要擴展分庫分表的范圍,可能需要進行數據遷移,這會增加系統的復雜性和風險。
總之,分庫分表有一些優點,但同時也有一些缺點,在實際應用中需要謹慎考慮。
責任編輯:武曉燕
來源:
今日頭條