使用要求
拆分键的类型必须是 DATE / DATETIME / TIMESTAMP 其中之一。
DRDS 实例的版本必须是 5.1.28-1320920 及其以上的版本。DRDS 版本说明请参考文档版本说明。
路由方式
根据分库键的时间值的年份与一年的天数进行计算哈希值,然后再按分库数去取余,完成路由计算。
例如:YYYYDD(‘2012-12-31 12:12:12’) 等价于 (计算出”2012-12-31”是 2012 年第 365 天,即 2012*366 + 365) % D。D 是分库数目。
使用场景
适用于需要按年份与一年的天数进行分库的场景。建议该函数与 tbpartition YYYYDD(ShardKey) 联合使用。
例如,假设用户的 DRDS 里已经分了 8 个物理库,现业务有如下的场景:
一个业务想按年天进行分库;
要求是同一周的数据都能落在同一张分表,并且两年以内的每个天都能单独对应一张分表;
查询时带上分库分表键后能直接将查询落在某个物理分库的某个物理分表。
这时就可以使用 YYYYDD 的分库函数进行解决。业务要求两年以内的每天都对应一张分表(就是一天一张表),由于一年有最多 366 天,所以两年至少需要创建 732 个物理分表才能满足用户的场景。用户的 DRDS 有 8 个分库,所以每个分库应该建 92 张物理分表(732 / 8 = 91.5,取整为 92, 分表数最好是分库数的整数倍)。因此,与用户业务场景应该对应的 DDL 应该是:
create table test_yyyydd_tb (
id int,
name varchar(30) DEFAULT NULL,
create_time datetime DEFAULT NULL,
primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by YYYYDD(create_time)
tbpartition by YYYYDD(create_time) tbpartitions 92;
注意事项
YYYYDD 不支持对于每一个年天都独立对应一张分表,YYYYDD 的分库分表必须固定分表数目。
当日期经过一个轮回(如 2013-03-01 是 2012-03-01 的一个轮回)后,同一个日期有可能被路由到同一个分库分表,视实际的分表数目而定。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。