本文將介紹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);