全部产品
云市场

UNI_HASH

更新时间:2018-04-27 22:08:54

使用要求

  • 拆分键的数据类型必须是整数类型或字符串类型。
  • DRDS 实例的版本必须是 5.1.28-1508068 及其以上的版本。DRDS 版本说明请参考文档版本说明

路由方式

使用 UNI_HASH 分库时,根据分库键的键值直接按分库数取余。如果键值是字符串,则字符串会被计算成哈希值再进行计算,完成路由计算,例如: HASH(‘8’) 等价于 8 % D(D 是分库数目)。

分库和分表都使用同一个拆分键进行 UNI_HASH 时,仍然保证先根据分库键键值按分库数取余( HASH不是 ),再均匀散布到该分库的各个分表上。

使用场景

  • 适合于需要按用户 ID 或订单 ID 进行分库的场景。
  • 适合于拆分键是整数或字符串类型的场景。
  • 两张逻辑表需要根据同一个拆分键进行分库,两张表的分表数不同,又经常会按该拆分键进行 JOIN 的场景。

与 HASH 的比较

在使用 UNI_HASH 分库但不分表时,UNI_HASH 和 HASH 的路由方式一样,都是根据分库键的键值按分库数取余。

分库和分表都使用同一个拆分键进行 HASH 时,随着分表数的变化,同一个键值分到的分库不是固定的。

分库和分表都使用同一个拆分键进行 UNI_HASH 时,无论分表数是多少,同一个键值总是分到相同的分库。

如果两张逻辑表需要根据同一个拆分键进行分库分表,但分表数不同,那么当两张表按该拆分键进行 JOIN 时,如果使用 HASH 会出现跨库 JOIN,而 UNI_HASH 不会有跨库 JOIN。

例如,假设用户有 2 个分库,有 2 张逻辑表:a 表每库 1 张分表,b表每库 2 张分表。下图展示了分别使用 HASH 和 UNI_HASH 进行拆分后,a 表和 b 表进行 JOIN 的情景:

uni_hash_func | left

使用示例

假设用户需要对 ID 列按 UNI_HASH 函数进行分库分表,每库 4 表,则应该执行以下建表 DDL 语句:

  1. create table test_hash_tb (
  2. id int,
  3. name varchar(30) DEFAULT NULL,
  4. create_time datetime DEFAULT NULL,
  5. primary key(id)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  7. dbpartition by UNI_HASH(ID)
  8. tbpartition by UNI_HASH(ID) tbpartitions 4;

注意事项

UNI_HASH 算法是简单取模,要求拆分列的值的自身分布均衡才能保证哈希均衡。