欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

mysql先分了10張表,后續在分表如何處理?

林玟書2年前19瀏覽0評論

MySQL分庫分表(其他關系型數據庫也相似),通常的方案都用主鍵mod分表的數量,來把數據路由到某一個數據庫分片上。例如分了10張表,那么就是ID%10,得到結果0-9,代表不同的表。

但是當數據量進一步增多的時候,單庫的數據量達到了一定的級別之后,那么就需要分更多的表,那么這時候有哪些處理方案呢?

做數據遷移

最簡單暴力,也是最麻煩的一個方案。

因為當分表(分庫)數量增多的時候,因為分片規則的變化,每個表的數據都要被重新分配到多個新的表;這種方法雖然最直接,但是帶來的問題也非常大:

  • 數據遷移時間會比較長,需要遷移時間;

  • 如果業務不能停的話(在線遷移),還要解決增量數據和歷史數據一致性的問題;

不做數據遷移

那么有沒有方法,當數據增長到現有分表極限的時候,加表或者加庫的時候,可以避免數據的遷移呢?說白了,我們需要增加分表算法的復雜性,讓算法可以兼容增加分表前后的數據路由:

  • 先說一個簡單的辦法,(為了方便講述,下面就把id當做分表字段),如果id是一個增長的全局序列,每個表存500萬的數據,那么可以id=1-500萬存到table_1,id=500萬零1-1000萬存到table_2,理論上這種方法是可以無限擴容的,但是問題也顯而易見,就是每個階段的數據insert會集中在一個表/庫上,雖然能避免數據遷移的問題,但是數據熱點的問題沒有解決。

  • 如果id是一個增長的全局序列,當前有十張表,那么分表的算法為:id%10,根據0-9路由到10個表中;當表擴到20張的時候,擴容那一刻取max_id,那么未來分庫的算法也就變成了:
if(id<max_id){id%10}else{id%20};
  • 有些分表的算法本身就帶時間戳,可以基于id中的時間戳來實現,比如Twitter-Snowflake算法,這個算法是一個64位的Long值,前42位就是一個精確到毫秒的時間戳,那么我們的分庫算法也就可以以某個時間點來判斷:

if(id中的時間<增加分表那一刻的時間){id%10}else{id%20};

我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。