淺談MySQL分表之動態分配和固定分配

分庫分表的業務需求

當我們無法簡單的通過向上擴展的來提高系統的性能的時候。簡單說,一個表的數據非常大,優化查詢帶來的效率提升變的微乎其微,並且表中的數據隨處都有可能被訪問(無法歸檔掉)。

拆分方式

固定分配

該方式按照某一個分區鍵,來對當前的數據表進行拆分。
例如:一個用戶表很大,我們可以根據用戶標識來進行用戶表的拆分,將當前用戶表的所有數據,打散到多個表中。
具體做法常見的有:

  1. 按照分區鍵取餘。
  2. 對分區鍵進行散列。

固定分配的主要優點就是:簡單,開銷很低,可以在代碼中硬編碼指定分片相關的操作
缺點:

  1. 如果分片很大,並且分片的數量不多,就很難做到不同分片之間的負載。
  2. 沒法自定義數據存檔到那個分片,這樣容易造成冷熱數據分分配不均勻,一部分的分片上數據訪問很頻繁,一部分分片上的數據訪問又很少。(但是如果分片分佈的足夠多,每個分片的大小又比較小的情況下,根據大數定理,這個問題也就沒那麼嚴重,因爲可以更容易的做到將熱點數據分配到不同的分片上)。
  3. 修改分片策略就很麻煩,因爲之前是按照某一個分區鍵的處理將數據分散到不同的分片。如果對分片策略做調整,將會導致數據在分片間的轉移,和大量的數據更新,這個比較難處理。

對於已有應用,使用固定分配的方式處理分片,更加簡單和容易,但是對於新應用,儘可能的使用動態分配,將會更好些,因爲固定分配的應用遲早會轉成動態分配。

動態分配

動態的調整數據所處的分片。
比如有一個有兩列的表,用戶ID和分片ID。

CREATE TABLE user_to_shard (
    user_id int not null,
    shard_id int not null,
    PRIMARY_KEY(user_id)
);

優點:

  1. 因此我們可以做到動態調整一個user_id的數據所處的分片。
  2. 其最大的好處是,可以對數據的存儲位置做到細粒度的控制,使得均衡分配數據到分片更加容易。
  3. 可以生成不均衡的分片,從而應對處理器性能不一致的問題。
  4. 能夠利用分片的親和性和動態分配策略,減輕擴大規模導致的跨分配查詢的性能問題。
  5. 動態分配的分配策略可以變的很複雜,但固定分配做不到。

上述第四點解釋:
。假設一個跨分片的查詢,需要涉及4個節點,使用固定分配的方式時,任何給定的查詢可能需要訪問所有節點,但是動態分片只需要訪問3個節點在節點數較少時,區別不那麼明顯。但是假設分片數很多,比如到400個分片時,固定分配還是需要訪問所有節點,但是動態分配只需訪問3個。高下立見。

缺點:

增加了分區函數的開銷,同時多了一次查詢數據所屬分片的情況開銷。需要調用一次外部資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章