レンジパーティショニングは、テーブルデータを、定義された範囲内に収まる列値に基づいて複数のパーティションに分割する手法です。各パーティションには、パーティションキーが指定された境界値未満である行が格納され、境界値は厳密に単調増加でなければなりません。
以下の用途では、レンジパーティショニングが有効です:
期間ごとのクエリまたはデータ削除 — 日付フィルター付きの
DELETEを実行する代わりに、パーティション全体をドロップできます。これは大規模なテーブルにおいて、大幅に高速です。連続する数値範囲によるパーティショニング — たとえば、売上金額、ID、スコアなどです。
パーティションプルーニングによるクエリ性能の向上 — パーティションキーでフィルター処理を行うクエリでは、関係のないパーティションを完全にスキップできます。
PolarDB for MySQL では、次の 2 種類の構文をサポートしています:PARTITION BY RANGE(式ベース、単一列)および PARTITION BY RANGE COLUMNS(列ベース、複数列およびより多くのデータ型をサポート)。
構文
CREATE TABLE ... PARTITION BY RANGE {(expr) | COLUMNS(column_list)}
(partition_definition [, partition_definition] ...);ここで、partition_definition は以下のとおりです:
PARTITION partition_name
VALUES LESS THAN {(value | value_list) | MAXVALUE}パラメーター
| パラメーター | 説明 |
|---|---|
expr | パーティション式です。INT 型の値に評価される必要があります。文字列型はサポートされていません。 |
column_list | RANGE COLUMNS で使用するパーティションキー列の一覧です。式はサポートされておらず、列名のみが許可されます。 |
value | パーティションの上限境界値です。 |
value_list | 上限境界値の一覧(列ごとに 1 つずつ)。複数のパーティションキーが指定されている場合の RANGE COLUMNS で使用します。 |
MAXVALUE | パーティションの最大値です。すべての行が対応するパーティションに割り当てられるよう、必ず最後のパーティションとして MAXVALUE を含むパーティションを追加してください。 |
partition_name | パーティションの名前です。テーブル内で一意である必要があります。 |
RANGE と RANGE COLUMNS の比較
| 機能 | PARTITION BY RANGE | PARTITION BY RANGE COLUMNS |
|---|---|---|
| パーティションキー数 | 単一列のみ | 1 列以上 |
| 式 | サポート | 非サポート(列名のみ許可) |
| サポートされるデータ型 | INT(式は INT に評価される必要あり) | INT、文字列型、DATE、DATETIME |
DATE や DATETIME 型の列を直接パーティションキーとして使用したい場合、または複数列にまたがる複合パーティションキーが必要な場合は、RANGE COLUMNS を使用してください。
例
数値範囲によるパーティショニング
以下の例では、売上テーブルを amount 列でパーティション化しています。各パーティションには、amount が境界値未満である行が格納されます。最終パーティションでは、残りのすべての行をカバーするために MAXVALUE を使用しています。
CREATE TABLE sales_range
(
dept_no INT,
part_no INT,
country VARCHAR(20),
date DATE,
amount INT
)
PARTITION BY RANGE(amount)
(
PARTITION p0 VALUES LESS THAN (1000),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN (3000),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
);日付列によるパーティショニング(RANGE COLUMNS)
RANGE COLUMNS を使用すると、式でラップすることなく、DATE 型の列を直接パーティションキーとして指定できます。以下の例では、create_date 列を基準に月次パーティションを作成しています。
CREATE TABLE sales_range_columns
(
dept_no INT,
part_no INT,
country VARCHAR(20),
create_date DATE,
amount INT
)
PARTITION BY RANGE COLUMNS(create_date)
(
PARTITION p1 VALUES LESS THAN ('2023-01-01'),
PARTITION p2 VALUES LESS THAN ('2023-02-01'),
PARTITION p3 VALUES LESS THAN ('2023-03-01'),
PARTITION p4 VALUES LESS THAN ('2023-04-01')
);複数列によるパーティショニング(RANGE COLUMNS)
RANGE COLUMNS では、複合パーティションキーがサポートされます。
CREATE TABLE sales_range_columns
(
dept_no INT,
part_no INT,
country VARCHAR(20),
date DATE,
amount INT
)
PARTITION BY RANGE COLUMNS(dept_no, part_no)
(
PARTITION p1 VALUES LESS THAN (1000, MAXVALUE),
PARTITION p2 VALUES LESS THAN (2000, MAXVALUE),
PARTITION p3 VALUES LESS THAN (3000, MAXVALUE),
PARTITION p4 VALUES LESS THAN (4000, MAXVALUE)
);