YYYYWEEK
使用要求
- 拆分键的类型必须是 DATE / DATETIME / TIMESTAMP 其中之一。
- DRDS 实例的版本必须是 5.1.28-1320920 及其以上的版本。DRDS 版本说明请参考文档版本说明。
路由方式
根据分库键的时间值的年份
与一年的周数
进行计算哈希值,然后再按分库数去取余,完成路由计算。
例如:YYYYWEEK(‘2012-12-31 12:12:12’) 等价于 (计算出”2012-12-31”是 2013 年第 1 周,即 2013*52 + 1) % D,(D 是分库数目)。
使用场景
适合于需要按年份
与一年的周数
进行分库的场景,建议该函数会与 tbpartition YYYYWEEK(ShardKey) 同联合使用。
例如,假设用户的 DRDS 里已经分了 8 个物理库, 现业务有如下的场景:
- 一个业务想按年周进行分库;
- 要求是同一周的数据都能落在同一张分表,并且
两年以内的每个周都单独对应一张分表
; - 查询时带上分库分表键后能直接将查询落在某个物理分库的某个物理分表。
那么, 用户这时就可以使用 YYYYWEEK 的分库函数进行解决:业务要求两年以内的每个周都对应一张分表(就是一个周一张表),由于一年有近 53 个周(四舍五入),所以两年至少需要创建 106 个物理分表才能满足用户的场景,而用户的 DRDS 有 8 个分库,所以每个分库应该建 14 张物理分表(14 * 8 = 112 > 106, 分表数最好是分库数的整数倍)。因此,与用户业务场景应该对应的 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 YYYYWEEK(create_time)
tbpartition by YYYYWEEK(create_time) tbpartitions 14;
注意事项
- YYYYWEEK 不支持对于每一个年周都独立对应一张分表,YYYYWEEK 的分库分表必须固定分表数目。
- 当周数经过一个轮回(如 2013 第 1 周是 2012 第一周的一个轮回)后,相同周数有可能被路由到同一个分库分表,视实际的分表数目而定。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论