本文將介紹UNI_HASH的使用方式。
注意事項
UNI_HASH演算法是簡單模數,要求拆分列的值的自身分布均衡才能保證雜湊均衡。
使用限制
- 拆分鍵的資料類型必須是整數類型或字串類型。
- PolarDB-X 1.0執行個體的版本需為5.1.28-1508068或以上。
路由方式
UNI_HASH主要用於以下情境:
- 使用UNI_HASH分庫時,根據分庫鍵的索引值直接按分庫數取餘。如果索引值是字串,則字串會被計算成雜湊值再進行計算,完成路由計算,例如
HASH('8')等價於8 % D(D 是分庫數目)。 - 分庫和分表都使用同一個拆分鍵進行UNI_HASH時,先根據分庫鍵索引值按分庫數取餘,再均勻散布到該分庫的各個分表上。
使用情境
- 適合於需要按使用者ID或訂單ID進行分庫的情境。
- 適合於拆分鍵是整數或字串類型的情境。
- 兩張邏輯表需要根據同一個拆分鍵進行分庫,兩張表的分表數不同,又經常會按該拆分鍵進行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;與HASH的比較
| 對比情境 | UNI_HASH | HASH |
| 分庫不分表。 | 此時兩個函數的路由方式一樣,都是根據分庫鍵的索引值按分庫數取餘。 | |
| 使用同一個拆分鍵進行分庫分表。 | 同一個索引值分到的分庫的路由結果不會隨著分表數的變化而改變。 | 同一個索引值分到的分庫會隨著分表數的變化而改變。 |
| 兩張邏輯表需要根據同一個拆分鍵進行分庫分表,但分表數不同。 | 當兩張表按該拆分鍵進行JOIN時,不會出現跨庫JOIN的情況。 | 當兩張表按該拆分鍵進行JOIN時,會出現跨庫JOIN的情況。 |