使用要求
拆分键的类型必须是 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 的一个轮回)后,同一个月份就有可能被路由到同一个分库分表,视实际的分表数目而定。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您的描述,您正在了解如何在阿里云分布式关系型数据库服务(DRDS)中使用YYYYMM
函数进行时间相关的分库分表操作。下面是对您提供信息的总结和补充说明:
YYYYMM
函数。可以通过阿里云控制台查看并升级DRDS版本。YYYYMM
函数基于时间值(年月)计算哈希值,并通过分库数取余来决定数据的存储位置。例如,对于日期'2012-12-31 12:12:12',其路由计算简化为(2012 * 12 + 12) % D
,其中D代表分库数量。
适用于需要按年月维度分库分表的业务场景,比如财务系统、日志系统等,这些场景往往要求特定月份的数据聚合在一起,便于管理和查询。
假设您有8个物理库,且业务需求是两年内每个月份的数据分别存储在不同的表中,每个库需创建3张物理分表(因为24个月除以8个库等于每库3张表)。对应的DDL语句示例如您所给,创建了一个名为test_yyyymm_tb
的表,利用dbpartition by YYYYMM(create_time)
进行分库,同时用tbpartition by YYYYMM(create_time) tbpartitions 3;
定义了每个库内的3个分表,均按照创建时间的年月进行划分。
YYYYMM
时,预先确定的分表数量是固定的,不支持动态调整到每一个年月对应一张表。综上所述,YYYYMM
函数是解决按时间维度分库分表需求的有效工具,但使用时需注意其限制条件和潜在的循环路由问题,合理规划以满足业务的扩展性和性能需求。