Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


19.2.4.1 LINEAR HASH パーティショニング

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 は次のアルゴリズムに従って導出されます。

  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 = 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' である 2 つのレコードを t1 に挿入するとします。これらの 1 番目のパーティション番号は次のように決定されます。

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)

2 番目のレコードが格納されるパーティションの番号は、次のように計算されます。

V = 8
N = YEAR('1998-10-19') & (8-1)
  = 1998 & 7
  = 6

(6 >= 6 is TRUE: additional step required)

N = 6 & CEILING(8 / 2)
  = 6 & 3
  = 2

(2 >= 6 is FALSE: record stored in partition #2)

線形ハッシュによるパーティショニングの利点は、パーティションの追加、削除、マージ、および分割の速度が向上することです。これは、非常に大量 (テラバイト) のデータが含まれるテーブルを扱うときに利点になることがあります。欠点は、通常のハッシュパーティショニングを使用して獲得される配分と比べて、データがパーティションに均等に配分される可能性が低いことです。


User Comments
  Posted by Chris Wagner on April 20, 2011
Linear hashing is a bad name considering that it creates a bell curve style distribution. Here are some distribution patterns on a keyed list of integers (0 - 64k) with some associated data volume. The first column is the partition, the second is the number of rows that would go in that partition, and the percentage is that of the total data volume. U can see that if the number of partitions is a power of 2 then the two methods are the same.

Basically, with linear hashing the middle partions will have 2x the size of the outer ones.

8 partitions

Modulo hashing distribution

0 1286793 12.43%
1 1293976 12.50%
2 1281279 12.38%
3 1295948 12.52%
4 1307476 12.63%
5 1291118 12.48%
6 1294605 12.51%
7 1297231 12.54%

Linear hashing distribution

0 1286793 12.43%
1 1293976 12.50%
2 1281279 12.38%
3 1295948 12.52%
4 1307476 12.63%
5 1291118 12.48%
6 1294605 12.51%
7 1297231 12.54%

9 partitions

Modulo hashing distribution

0 1137765 10.99%
1 1152313 11.14%
2 1139055 11.01%
3 1153697 11.15%
4 1150596 11.12%
5 1158082 11.19%
6 1148080 11.09%
7 1155944 11.17%
8 1152894 11.14%

Linear hashing distribution

0 638360 6.17%
1 1293976 12.50%
2 1281279 12.38%
3 1295948 12.52%
4 1307476 12.63%
5 1291118 12.48%
6 1294605 12.51%
7 1297231 12.54%
8 648433 6.27%

7 partitions

Modulo hashing distribution

0 1483555 14.34%
1 1470934 14.21%
2 1487062 14.37%
3 1481081 14.31%
4 1477711 14.28%
5 1468336 14.19%
6 1479747 14.30%

Linear hashing distribution

0 1286793 12.43%
1 1293976 12.50%
2 1281279 12.38%
3 2593179 25.06%
4 1307476 12.63%
5 1291118 12.48%
6 1294605 12.51%

12 partitions

Linear hashing distribution

0 638360 6.17%
1 643268 6.22%
2 637077 6.16%
3 650900 6.29%
4 1307476 12.63%
5 1291118 12.48%
6 1294605 12.51%
7 1297231 12.54%
8 648433 6.27%
9 650708 6.29%
10 644202 6.23%
11 645048 6.23%

For comparison, this is what it looks like just on the integer alone (no data volume).

7 partitions

Modulo hashing distribution

0 9363 14.29%
1 9362 14.29%
2 9362 14.29%
3 9362 14.29%
4 9362 14.29%
5 9362 14.29%
6 9362 14.29%

Linear hashing distribution

0 8192 12.50%
1 8192 12.50%
2 8192 12.50%
3 16383 25.00%
4 8192 12.50%
5 8192 12.50%
6 8192 12.50%

  Posted by Steven Roussey on June 22, 2011
For linear, the number of partitions ought to be a power of 2. So 4, 8, 16, 32, etc., would be good choices...
Sign Up Login You must be logged in to post a comment.