天天看點

DRDS分庫分表學習-按月份拆分表

使用要求

  • 拆分鍵的類型必須是 DATE / DATETIME / TIMESTAMP 其中之一。
  • DRDS 執行個體的版本必須是 5.1.28-1320920 及其以上的版本。DRDS 版本說明請參考文檔版本說明。

路由方式

根據拆分鍵的時間值的​

​年份​

​​與​

​月份​

​進行計算哈希值,然後再按分庫數去取餘,完成路由計算。

例如:YYYYMM(‘2012-12-31 12:12:12’) 等價于 (2012 * 12 + 12) % D, (D 是分庫數目)。

使用場景

适合于需要按​

​年份​

​​與​

​月份​

​進行分庫的場景,建議該函數會與 tbpartition YYYYMM(ShardKey) 聯合使用。

例如,假設使用者的 DRDS 裡已經分了 8 個實體庫,現業務有如下的場景:

  1. 一個業務想按年月進行分庫;
  2. 要求是同一個月的資料能落在同一張分表,并且​

    ​兩年以内的每個月都單獨對應一張分表​

    ​;
  3. 查詢時帶上分庫分表鍵後能直接将查詢落在某個實體分庫的某個實體分表。

那麼, 使用者這時就可以使用 YYYYMM 的分庫函數進行解決:業務要求兩年以内的每個月都對應一張分表(就是一個月一張表),由于一年有 12 個月,是以至少需要建立 24 個實體分表才能滿足使用者的場景,而使用者的 DRDS 有 8 個分庫,是以每個分庫應該建 3 張實體分表。是以,與使用者業務場景應該對應的 DDL 應該是:

create table test_yyyymm_tb (    
        id int, 
        name varchar(30) DEFAULT NULL,  
        create_time datetime DEFAULT NULL,
        primary key(id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 
    dbpartition by YYYYMM(create_time)
    tbpartition by YYYYMM(create_time) tbpartitions 3;      

注意事項

  • YYYYMM 不支援對于每一個年月都獨立對應一張分表,YYYYMM 的分庫分表必須固定分表數目。
  • 當月份經過一個輪回(如 2013-03 是 2012-03 的一個輪回)後,同一個月份就有可能被路由到同一個分庫分表,視實際的分表數目而定。

作者:沐雪

文章均系作者原創或翻譯,如有錯誤不妥之處,歡迎各位批評指正。本文版權歸作者所有,如需轉載懇請注明。