全部产品
云市场
云游戏

YYYYDD

更新时间:2020-08-03 16:01:51

使用要求

  • 拆分键的类型必须是DATE、DATETIME或TIMESTAMP其中之一。
  • PolarDB-X实例的版本必须是5.1.28-1320920及其以上的版本。PolarDB-X版本说明请参见版本说明

路由方式

根据分库键的时间值的年份一年的天数进行计算哈希值,然后再按分库数去取余,完成路由计算。

例如:YYYYDD('2012-12-31 12:12:12')等价于(计算出"2012-12-31"是2012年第365天,即 2012\*366 + 365)% D,D是分库数目。

使用场景

适用于需要按年份一年的天数进行分库的场景。建议该函数与tbpartition YYYYDD(ShardKey)联合使用。

例如,假设用户的PolarDB-X里已经分了8个物理库,现业务有如下的场景:

  1. 一个业务想按年天进行分库;
  2. 要求是同一周的数据都能落在同一张分表,并且两年以内的每个天都能单独对应一张分表
  3. 查询时带上分库分表键后能直接将查询落在某个物理分库的某个物理分表。

这时就可以使用YYYYDD的分库函数进行解决。业务要求两年以内的每天都对应一张分表(就是一天一张表),由于一年有最多366天,所以两年至少需要创建732个物理分表才能满足用户的场景。用户的PolarDB-X有8个分库,所以每个分库应该建92张物理分表(732 / 8 = 91.5,取整为 92,分表数最好是分库数的整数倍)。因此,与用户业务场景应该对应的DDL应该是:

  1. create table test_yyyydd_tb (
  2. id int,
  3. name varchar(30) DEFAULT NULL,
  4. create_time datetime DEFAULT NULL,
  5. primary key(id)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  7. dbpartition by YYYYDD(create_time)
  8. tbpartition by YYYYDD(create_time) tbpartitions 92;

注意事项

  • YYYYDD不支持对于每一个年天都独立对应一张分表,YYYYDD的分库分表必须固定分表数目。
  • 当日期经过一个轮回(如2013-03-01是2012-03-01的一个轮回)后,同一个日期有可能被路由到同一个分库分表,视实际的分表数目而定。