MySQL 8.4 版本注意事項
MySQL 也支援線性雜湊,它與常規雜湊的不同之處在於,線性雜湊使用線性 2 的冪次演算法,而常規雜湊則使用雜湊函數值的模數。
在語法上,線性雜湊分割和常規雜湊的唯一區別是在 PARTITION BY
子句中加入了 LINEAR
關鍵字,如下所示
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY LINEAR HASH( YEAR(hired) )
PARTITIONS 4;
給定一個表達式 expr
,當使用線性雜湊時,記錄儲存的分割區號是 num
個分割區中的分割區號 N
,其中 N
是根據以下演算法得出的
找出大於
num
的下一個 2 的冪次。我們將這個值稱為V
;它可以計算為V = POWER(2, CEILING(LOG(2, num)))
(假設
num
為 13。則LOG(2,13)
為 3.7004397181411。CEILING(3.7004397181411)
為 4,而V
=POWER(2,4)
,即為 16。)設定
N
=F
(column_list
) & (V
- 1)。當
N
>=num
時設定
V
=V
/ 2設定
N
=N
& (V
- 1)
假設使用此陳述式建立使用線性雜湊分割且具有 6 個分割區的資料表 t1
CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
PARTITION BY LINEAR HASH( YEAR(col3) )
PARTITIONS 6;
現在假設您想將兩個具有 col3
欄位值 '2003-04-14'
和 '1998-10-19'
的記錄插入到 t1
中。第一個的分割區號計算如下
V = POWER(2, CEILING( LOG(2,6) )) = 8
N = YEAR('2003-04-14') & (8 - 1)
= 2003 & 7
= 3
(3 >= 6 is FALSE: record stored in partition #3)
第二個記錄的分割區號計算如下所示
V = 8
N = YEAR('1998-10-19') & (8 - 1)
= 1998 & 7
= 6
(6 >= 6 is TRUE: additional step required)
N = 6 & ((8 / 2) - 1)
= 6 & 3
= 2
(2 >= 6 is FALSE: record stored in partition #2)
按線性雜湊進行分割的優點是分割區的加入、刪除、合併和分割速度更快,這在處理包含極大量(TB)資料的資料表時可能很有益。缺點是與使用常規雜湊分割獲得的分配相比,資料不太可能均勻分佈在分割區之間。