本文將介紹HASH函數使用方式。

注意事項

HASH函數的算法是簡單取模,要求拆分列的值的自身分布均衡才能保證哈希均衡。

使用限制

拆分鍵的數據類型必須是整數類型或字符串類型。

路由方式

  • 若分庫和分表使用不同拆分鍵進行HASH時,則根據分庫鍵的鍵值直接按分庫數取余。如果鍵值是字符串,則字符串會先被換算成哈希值再進行路由計算。例如HASH(8)等價于8 % D(D是分庫數目), 而HASH("ABC")等價于hashcode("ABC").abs() % D(D是分庫數目)。
  • 若分庫和分表都使用同一個拆分鍵進行HASH時,則根據拆分鍵的鍵值按總的分表數取余。例如有2個分庫,每個分庫4張分表,那么0庫上保存分表0~3,1庫上保存分表4~7。某個鍵值為15,那么根據該路由方式,則該鍵值15將被分到1庫的表7上((15 % (2 * 4) =7))。

使用場景

HASH函數主要應用與如下場景:

  • 適合于需要按用戶ID或訂單ID進行分庫的場景。
  • 適合于拆分鍵是字符串類型的場景。

示例

假設需要對ID列按HASH函數進行分庫不分表,則您可以使用如下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 HASH(ID);