更新时间:2022-08-16 GMT+08:00

YYYYWEEK算法

适用场景

适用于需要按年份与一年的周数进行分库的场景。

使用说明

拆分键的数据类型必须是DATE / DATETIME / TIMESTAMP其中之一。

路由方式

根据拆分键的时间值的年份与一年的周数计算哈希值,然后再按分库/表数取余。

例如,YYYYWEEK(‘2018-12-31 12:12:12’) 等价于 (2019 * 54 + 1) % D(D是分库数目)。

此处“2018-12-31”是2019年第一周。计算公式中“2019*54”的“54”为固定取值。

算法计算方式

表1 计算方式

条件

计算方式

举例

分库拆分键 ≠ 分表拆分键

拆分键:yyyy-MM-dd

分库路由结果 = (yyyy * 54 + 一年第几周) % 分库数

分表路由结果 = (yyyy * 54 + 一年第几周) % 分表数

拆分键:2012-12-31

分库 :(2013 * 54 + 1) % 8 = 7

分表:(2013 * 54 + 1) % 3 = 1

分库拆分键 = 分表拆分键(拆分键)

拆分键:yyyy-MM-dd

分表路由结果 = (yyyy * 54 + 一年第几周) % (分库数 * 分表数)

分库路由结果 = 分表路由结果 / 分表数

拆分键:2012-12-31

分库 :(2013 * 54 + 1) % (8*3) = 7

分库 :7 / 3 = 2

建表语法

create table yyyyweek_tb( 
    id int, 
    name varchar(30) DEFAULT NULL, 
    create_time datetime DEFAULT NULL,
update_time datetime DEFAULT NULL, 
    primary key(id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 
dbpartition by YYYYWEEK(create_time)
tbpartition by YYYYWEEK(update_time) tbpartitions 54;

注意事项

  • 拆分键和键值皆不能修改。
  • YYYYWEEK算法不支持对于每一个年周都独立对应一张分库。
  • 当周数经历一个轮回(如2013年第一周是2012年第一周的一个轮回)后,相同周数有可能被路由到同一个分库,请以实际的分库数目而定。