MySQL はリニアハッシュもサポートします。リニアハッシュが通常のハッシュと異なるところは、ハッシュがハッシュ関数値の係数を使用するところ、リニアハッシュはリニア二乗アルゴリズムを使用します。
構文的に、リニアハッシュパーティショニングと通常のハッシュパーティショニングの唯一の違いは、以下に示されるよう、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
よりも大きい二乗を探してください。この値を
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 =
CEIL(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
に2つのレコードを挿入したいとします。最初のパーティション番号は以下のように決定されます。
V= POWER(2, CEILING( LOG(2,7) )) = 8N= YEAR('2003-04-14') & (8 - 1) = 2003 & 7 = 3 (3 >= 6 is FALSE: record stored in partition #3)
2番目のレコードが記憶されているパーティションの番号は以下の様に計算されます。
V= 8N= YEAR('1998-10-19') & (8-1) = 1998 & 7 = 6 (6 >= 6 is TRUE: additional step required)N= 6 & CEILING(8 / 2 - 1) = 6 & 3 = 2 (2 >= 6 is FALSE: record stored in partition #2)
リニアハッシュによるパーティショニングの利点は、パーティションの追加、削除、結合、そして分裂のスピードアップが図れることです。これは、大量のデータ(テラバイト級)を含むテーブルを取り扱う際に、効果的です。欠点は、通常のハッシュパーティショニングを使用した時に比べデータがパーティションの間で不均等に割り振られていることがあります。
