使用要求
- 拆分鍵的類型必須是 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 個物理庫,現業務有如下的場景:
- 一個業務想按年月進行分庫;
- 要求是同一個月的數據能落在同一張分表,並且
兩年以內的每個月都單獨對應一張分表
; - 查詢時帶上分庫分表鍵后能直接將查詢落在某個物理分庫的某個物理分表。
那么, 用戶這時就可以使用 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 的一個輪回)后,同一個月份就有可能被路由到同一個分庫分表,視實際的分表數目而定。