本文將介紹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的情況。
假設有2個物理分庫(DB_0和DB_1),2張邏輯表(a和b),其中a表每庫1張分表,b表每庫2張分表。下圖展示了分別使用HASH和UNI_HASH進行拆分后,a表和b表進行JOIN的情景:1