更新时间:2022-08-16 GMT+08:00
YYYYDD算法
适用场景
适用于需要按年份与一年的天数进行分库的场景。
使用说明
拆分键的数据类型必须是DATE / DATETIME / TIMESTAMP其中之一。
路由方式
根据拆分键的时间值的年份与一年的天数计算哈希值,然后再按分库/表数取余。
例如,YYYYDD(‘2018-12-31 12:12:12’) 等价于 (2018 * 366 + 365) % D(D是分库数目)。
计算得出“2018-12-31”是 2018 年第 365 天。计算公式中“2018*366”的“366”为固定取值。
算法计算方式
条件 |
计算方式 |
举例 |
---|---|---|
分库拆分键 ≠ 分表拆分键 |
拆分键:yyyy-MM-dd 分库路由结果 = (yyyy * 366 + 一年第几天) % 分库数 分表路由结果 = (yyyy * 366 + 一年第几天) % 分表数 |
拆分键:2012-12-31 分库 :(2012 * 366 + 366) % 8 = 6 分表:(2012 * 366 + 366) % 3 = 0 |
分库拆分键 = 分表拆分键(拆分键) |
拆分键:yyyy-MM-dd 分表路由结果 = (yyyy * 366 + 一年第几天) % (分库数 * 分表数) 分库路由结果 = 分表路由结果 / 分表数 |
拆分键:2012-12-31 分库 :(2012 * 366 + 366) % (8*3) = 6 分库 :6 / 3 = 2 |
建表语法
create table yyyydd_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 YYYYDD(create_time) tbpartition by YYYYDD(update_time) tbpartitions 30;
注意事项
- 拆分键和键值皆不能修改。
- YYYYDD算法不支持对于每一个年天都独立对应一张分库。
- 当日期经历一个轮回(如 2013-03 是 2012-03 的一个轮回)后,同一个日期有可能被路由到同一个分库,请以实际的分库数目而定。
父主题: 拆分算法使用说明