MySQL 8.4 參考手冊  /  ...  /  LINEAR HASH 分割

26.2.4.1 線性雜湊分割

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 是根據以下演算法得出的

  1. 找出大於 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。)

  2. 設定 N = F(column_list) & (V - 1)。

  3. 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)資料的資料表時可能很有益。缺點是與使用常規雜湊分割獲得的分配相比,資料不太可能均勻分佈在分割區之間。