レンジによってパーティショニングされたテーブルは、特定のレンジにおいて行のパーティショニング表現値が置かれるように、パーティショニングされます。レンジは連続していますがかぶることは無く、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. 「パーティションの刈り込み」
を参照してください。