MySQL 5.1 リファレンスマニュアル :: 15 パーティショニング :: 15.2 パーティショニングのタイプ :: 15.2.3 HASH パーティショニング :: 15.2.3.1 LINEAR HASH パーティショニング
« 15.2.3 HASH パーティショニング

15.2.4 KEY パーティショニング »
Section Navigation      [Toggle]
  • 15.2.3 HASH パーティショニング
  • 15.2.3.1 LINEAR HASH パーティショニング

15.2.3.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 よりも大きい二乗を探してください。この値を 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' を持つ t1 に2つのレコードを挿入したいとします。最初のパーティション番号は以下のように決定されます。

V = POWER(2, CEILING( LOG(2,7) )) = 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 - 1) 
  = 6 & 3
  = 2

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

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

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates