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)
リニアハッシュによるパーティショニングの利点は、パーティションの追加、削除、結合、そして分裂のスピードアップが図れることです。これは、大量のデータ(テラバイト級)を含むテーブルを取り扱う際に、効果的です。欠点は、通常のハッシュパーティショニングを使用した時に比べデータがパーティションの間で不均等に割り振られていることがあります。