开发者社区 问答 正文

YYYYDD如何使用

使用要求

拆分键的类型必须是 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 的一个轮回)后,同一个日期有可能被路由到同一个分库分表,视实际的分表数目而定。

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

根据您的描述,您正在使用阿里云的分布式关系型数据库服务(DRDS)来设计一个按时间维度分库分表的场景。这里有几个关键点和操作建议:

使用YYYYDD分库函数的目的

  • 目标:实现数据按照年份与一年中的天数进行逻辑分片,确保同一周的数据落在同一物理分表中,并且保证两年内每天的数据都能单独对应一张分表。
  • 适用场景:适合那些对数据时效性、查询效率有高要求,且数据量随时间增长显著的业务场景,如日志存储、交易记录等。

实现步骤与注意事项

  1. 确认DRDS版本:首先确保您的DRDS实例版本满足要求,即5.1.28-1320920或更高版本,以支持YYYYDD分库函数。

  2. 设计分库分表策略

    • 分库键:选择日期时间字段作为拆分键,例如create_time
    • 路由计算:DRDS会基于YYYYDD函数计算哈希值,然后通过取余操作决定数据的物理存放位置。这确保了相同年天的数据被路由到相同的物理分库上。
  3. DDL创建表:根据您的需求,每个分库需要创建固定数量的分表。在您的例子中,总共有8个分库,每个分库需建92张表,共计736张表,以覆盖两年内每一天的数据。

  4. 编写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;
    

    这条语句定义了一个表,并指定了按照create_time字段的年天进行分库和分表,每个分表集包含92张表。

  5. 注意事项

    • 确保理解YYYYDD不支持动态增加分表,分表数目一经设定,在没有重新调整表结构的情况下是固定的。
    • 数据轮回问题:每过一个完整的周期(比如两年),由于分表数固定,同一天的数据可能被路由到同一个分库的不同分表中,但具体取决于分表的数量和分布算法。
    • 监控与维护:定期检查数据分布情况和系统性能,适时调整分库分表策略以应对数据量的增长。

综上所述,通过合理设计和配置,您可以利用阿里云DRDS的YYYYDD分库函数高效地管理时间序列数据,优化查询性能并满足特定的业务需求。

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