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上。
算法计算方式
方式一:拆分键是整型
条件 |
计算方式 |
举例 |
---|---|---|
分库拆分键 ≠ 分表拆分键 |
分库路由结果 = 分库拆分键值 % 分库数 分表路由结果 = 分表拆分键值 % 分表数 |
分库 :16 % 8 = 0 分表:16 % 3 = 1 |
分库拆分键 = 分表拆分键 |
分表路由结果 = 拆分键值 % (分库数 * 分表数) 分库路由结果 = 分表路由结果 / 分表数 |
分表:16 % (8 * 3) = 16 分库 :16 / 3 = 5 |
方式二:拆分键是字符类型
条件 |
计算方式 |
举例 |
---|---|---|
分库拆分键 ≠ 分表拆分键 |
分库路由结果 = 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算法是简单取模,要求拆分列的值自身分布均衡才能保证哈希均衡。