更新时间:2022-02-22 GMT+08:00

RIGHT_SHIFT算法

适用场景

当拆分键大部分键值的低位部位区分度比较低而高位部分区分度比较高时,则适用于通过此拆分算法提高散列结果的均匀度。

使用说明

拆分键的数据类型必须是整数类型(INT, INTEGER, BIGINT, MEDIUMINT, SMALLINT, TINYINT, DECIMAL, NUMERIC)。

路由方式

根据拆分键的键值(键值必须是整数)有符号地向右移二进制移指定的位数(位数由用户通过 DDL 指定),然后将得到的整数值按分库/分表数目取余。

算法计算方式

表1 计算方式

条件

计算方式

举例

分库拆分键 ≠ 分表拆分键

分库路由结果 = 分库拆分键值 % 分库数

分表路由结果 = 分表拆分键值 % 分表数

分库 :(123456 >> 4) % 8 = 4

分表:(123456 >> 4) % 3 = 0

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

分库路由结果 = 拆分键值 % 分库数

分表路由结果 = (拆分键值%分库数)*分表数+(拆分键值 /分库数)%分表数

分库 :(123456 >> 4) % 8 = 4

分表:((123456 >> 4) % 8) *3 + ((123456 >> 4)/8)%3= 13

建表语法

create table RIGHT_SHIFT (    
    id int, 
    name varchar(30) DEFAULT NULL,  
    create_time datetime DEFAULT NULL,
    primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
dbpartition by RIGHT_SHIFT(id, 4) 
tbpartition by RIGHT_SHIFT(id, 4) tbpartitions 2;

注意事项

  • 拆分键和键值皆不能修改。
  • 移位的数目不能超过整数类型所占有的位数目,路由到0分片。