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

MOD_HASH算法

使用说明

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

路由方式

根据分库键的键值按分库数取余,使用HASH分库但不使用同一个拆分键进行HASH分表时,分库键的键值按分库数取余。如果键值是字符串,则字符串会被计算成哈希值再对分库/表数取余。

例如,MOD_HASH('6')等价于6 % D(D是分库数目)。

分库和分表使用同一个拆分键进行HASH时,拆分键的键值按总的分表数取余。

例如,有2个分库,每个分库4张分表,那么0库上保存分表0~3,1库上保存分表4~7。某个键值为15,15 % (2 * 4) =7,所以15被分到1库的表7上。

算法计算方式

方式一:拆分键是整型

表1 拆分键是整型时的计算方式

条件

计算方式

举例

分库拆分键 ≠ 分表拆分键

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

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

分库 :16 % 8 = 0

分表:16 % 3 = 1

分库拆分键 = 分表拆分键

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

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

分表:16 % (8 * 3) = 16

分库 :16 / 3 = 5

方式二:拆分键是字符类型

表2 拆分键是字符型时的计算方式

条件

计算方式

举例

分库拆分键 ≠ 分表拆分键

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

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

hash(‘abc’)=‘abc’.hashCode()=96354

分库 :96354 % 8 = 2;

分表 :96354 % 3 = 0;

分库拆分键 = 分表拆分键

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

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

hash(‘abc’)=‘abc’.hashCode()=96354

分表 :96354% (8 * 3) = 18

分库 :18 / 3=6

建表语法

create table mod_hash_tb (
    id int,
    name varchar(30) DEFAULT NULL,  
    create_time datetime DEFAULT NULL,
    primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
dbpartition by mod_hash (ID)
tbpartition by mod_hash (ID) tbpartitions 6;

注意事项

  • 拆分键和键值皆不能修改。
  • MOD_HASH算法是简单取模,要求拆分列的值自身分布均衡才能保证哈希均衡。