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

15.2.2 LIST パーティショニング »
Section Navigation      [Toggle]
  • 15.2 パーティショニングのタイプ
  • 15.2.1 RANGE パーティショニング
  • 15.2.2 LIST パーティショニング
  • 15.2.3 HASH パーティショニング
  • 15.2.4 KEY パーティショニング
  • 15.2.5 サブパーティショニング
  • 15.2.6 MySQLパーティショニングの NULL 値の取り扱い

15.2.1. RANGE パーティショニング

レンジによってパーティショニングされたテーブルは、特定のレンジにおいて行のパーティショニング表現値が置かれるように、パーティショニングされます。レンジは連続していますがかぶることは無く、VALUES LESS THAN 演算子を使用して定義されます。次のいくつかの例では、ユーザが20のビデオレンタル店の個人情報を含む1から20のテーブルを作成しているとします。

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 NOT NULL,
    store_id INT NOT NULL
);

このテーブルは、ユーザのニーズによってさまざまな方法でレンジによるパーティショニングを行うことができます。1つには、store_id カラムを使用した方法があります。たとえば、PARTITION BY RANGE 節を使用して、4方法でテーブルをパーティショニングすると決めたとします。

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 NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN (21)
);

このパーティショニングスキーマでは、p0 パーティションに記憶されるのは店舗1-5で働く店員を含む行で、p1 パーティションに記憶されるのは店舗6-10の店員になります。各パーティションは小から大まで順番どおりにパーティションが分けられていることに注目してください。これは PARTITION BY RANGE 構文の要求です。switch ... case、C、Javaなどと同義であると考えていいでしょう。

(72, 'Michael', 'Widenius', '1998-06-25', NULL, 13) データを含む新しい行が p2 パーティションに挿入されていることは断定できますが、チェーンに 21 番目の店舗が追加された時はどうでしょう。このスキーマでは、store_id が20よりも大きい行をカバーしているというルールが無いため、サーバが何処に情報を置くかを判断しかねるため、エラーが発生します。.「キャッチオール」 VALUES LESS THAN 節を CREATE TABLE ステートメントで使用することによって、明確に挙げられる最高値よりも高い値全てに対応することができます。

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 NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

MAXVALUE はありうる最高の整数値を表しています。store_id カラム値が16かそれ以上のものは、 (定義される最高値) p3 パーティションに記憶されます。いずれ将来、— 25、30、もしくはさらに店舗が増えた時、— ALTER TABLE ステートメントを使用して21-25、26-30の店舗のために新しいパーティションを作成することができます。(方法に関しては、項15.3. 「パーティショニング管理」 を参照してください。)

同様に、雇用者コードに合わせてテーブルをパーティションすることができます。—それは、job_codeカラム値によるレンジで可能になります。例えば、— 二桁雇用コードがストア店員、3桁コードが事務・サポート員に、そして4桁コードが基幹職を示している場合、—以下を使用してパーティショニングされたテーブルを作成することができます。

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 NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (job_code) (
    PARTITION p0 VALUES LESS THAN (100),
    PARTITION p1 VALUES LESS THAN (1000),
    PARTITION p2 VALUES LESS THAN (10000)
);

この場合、全てのストア店員に関する行は p0 パーティションで記憶され、事務・サポート要因に関する行は p1 、そして基幹職は p2 となります。

他にも VALUES LESS THAN 節で表現を使用することができます。ただし、, MySQLは表現の返される値を LESS THAN (<) 比較の一部として評価できることが前提となります。

店舗番号ごとにテーブルデータをパーティショニングするよりも、2つのうち1つの DATE カラムの表現を使用することができます。例えば、社員が会社を辞めた年度ごとにパーティショニングするとします。それは、YEAR(separated) の値となります。そのようなパーティショニングされたスキーマを実装する CREATE TABLE ステートメントの例がここに記されています。

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 RANGE ( YEAR(separated) ) (
    PARTITION p0 VALUES LESS THAN (1991),
    PARTITION p1 VALUES LESS THAN (1996),
    PARTITION p2 VALUES LESS THAN (2001),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

このスキーマでは、1991より前に辞めた社員に限って、行は p0 パーティションで記憶されています。1991から1995の間に辞めた社員はp1、1996 から2000の間に辞めた社員は p2 そして2000以降に辞めた社員は p3 で記憶されています。

レンジパーティショニングは以下のような時に特に有用です。

  • 「old」 データを呼び出したい、もしくは削除したい。上記で記されているパーティショニングされたスキーマを使用している場合、ALTER TABLE employees DROP PARTITION p0; 1991より前に辞めた全ての従業員に関する行を削除することができます。 (詳細については、項12.1.2. 「ALTER TABLE 構文」 と項15.3. 「パーティショニング管理」, を参照して下さい。)行の非常に多いテーブルに関しては、DELETE FROM employees WHERE YEAR(separated) <= 1990; といったような DELETE クエリを使用して効率よく作業を行うことができます。

  • 日付や時間の値、もしくは他のシリーズからなる値を含むカラムを使用したい場合。

  • テーブルパーティショニングのために使用されるカラムに直接従属するクエリを頻繁に使用する。例えば、SELECT COUNT(*) FROM employees WHERE YEAR(separated) = 2000 GROUP BY store_id; といったクエリを実行する場合、MySQLは p2 パーティションのみスキャンする必要があると断定します。これは残りのパーティションが WHERE 節を充たすレコードを含むことができないからです。これがどのように達成されるかについては、項15.4. 「パーティションの刈り込み」 を参照してください。

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