开发者社区 问答 正文

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 第一周的一个轮回)后,相同周数有可能被路由到同一个分库分表,视实际的分表数目而定。

展开
收起
猫饭先生 2017-10-30 11:40:39 1936 分享 版权
阿里云 AI 助理回答

从您的描述中,可以看出您正在讨论阿里云分布式关系型数据库服务(DRDS)的分库分表策略,特别是使用YYYYWEEK函数作为拆分键来实现按年份和周进行数据分布的场景。下面是对您提到内容的总结和补充说明:

使用要求

  • 拆分键类型:必须是 DATE、DATETIME 或 TIMESTAMP 类型之一,这是因为YYYYWEEK函数需要基于具体日期时间值来计算年份和周数。
  • DRDS版本:确保DRDS实例版本至少为5.1.28-1320920,以支持YYYYWEEK函数及相关的分库分表功能。

路由方式

  • YYYYWEEK函数根据给定日期时间值计算出该日期属于哪一年的第几周,然后通过哈希计算和取余操作将数据路由到特定的分库。例如,对于日期"2012-12-31 12:12:12",它实际上属于2013年的第一周,计算逻辑会转换成(2013*52 + 1) % D,D代表分库数量,以此决定数据存储的分库。

使用场景

  • 当业务需求涉及到按年周维度组织数据,且希望同一周的数据聚合在同一个物理分表上时,YYYYWEEK非常适用。
  • 特别适合于需要保持两年内每周数据独立性,并能快速定位查询指定周数据的场景。

示例与配置

  • 您提供的DDL示例展示了如何创建一个按照YYYYWEEK(create_time)进行分库分表的表结构,其中tbpartition by YYYYWEEK(create_time) tbpartitions 14;指定了每个分库包含14个分表,以满足至少两年内每周期对应一张表的需求。

注意事项

  • 固定分表数目:使用YYYYWEEK时,需要预先确定并固定分表的数量,不支持动态地为每个不同的年周创建新表。
  • 轮回效应:由于周数循环计数的特性,相同周数在不同年份可能被路由到相同的分库或分表,这取决于分表的具体数目和分配策略。设计时需考虑这种潜在的重叠对数据分布和查询性能的影响。

综上所述,YYYYWEEK函数是解决特定时间序列数据分片需求的有效工具,但实施前应仔细规划,确保分库分表策略既能满足业务需求,又能优化查询效率和系统扩展性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答