UNI_HASH
使用要求
- 拆分键的数据类型必须是整数类型或字符串类型。
- 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 的情景:
使用示例
假设用户需要对 ID 列按 UNI_HASH 函数进行分库分表,每库 4 表,则应该执行以下建表 DDL 语句:
create table test_hash_tb (
id int,
name varchar(30) DEFAULT NULL,
create_time datetime DEFAULT NULL,
primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by UNI_HASH(ID)
tbpartition by UNI_HASH(ID) tbpartitions 4;
注意事项
UNI_HASH 算法是简单取模,要求拆分列的值的自身分布均衡才能保证哈希均衡。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论