リストパーティション値が不均等に分布している場合、またはすべての値を列挙できない場合、標準的な LIST パーティションでは、VALUES IN 句に含まれていない値を持つ行の挿入が失敗し、エラーが返されます。LIST DEFAULT HASH は、マッチしなかったすべての行を受け止める 1 つ以上のデフォルトパーティションを追加することでこの問題を解決します。複数のデフォルトパーティションが必要な場合、ハッシュ規則により、これらの行が均等に分散されます。

仕組み
各挿入行は、リストパーティション規則に対して評価されます。
VALUES IN句に一致する行は、対応するリストパーティションに格納されます。どのリスト規則にも一致しない行は、デフォルトパーティションに格納されます。
複数のデフォルトパーティションが存在する場合、ハッシュ規則により、マッチしなかった行がそれらのパーティションに分散されます。
バージョン要件
LIST DEFAULT HASH を使用するには、以下のいずれかのクラスターバージョンが必要です。ご使用のバージョンを確認するには、「エンジンバージョンの照会」をご参照ください。
PolarDB for MySQL 8.0.1(リビジョン 8.0.1.1.34 以降)
PolarDB for MySQL 8.0.2(リビジョン 8.0.2.2.1 以降)
制限事項
| 制限事項 | 詳細 |
|---|---|
| デフォルトパーティション | 1 つ以上のデフォルトパーティションを作成できます。 |
| サブパーティションの組み合わせ | リストパーティションとデフォルトサブパーティションを組み合わせることは可能ですが、各パーティションは最大で 1 つのデフォルトサブパーティションのみをサポートします。 |
| サブパーティションの種類(単一デフォルト) | デフォルトパーティションが 1 つのみの場合、サブパーティションの種類は任意です。 |
| サブパーティションの種類(複数デフォルト) | 複数のデフォルトパーティションが存在する場合、サポートされるサブパーティションの種類はハッシュまたはキーのみです。 |
リスト・デフォルト・ハッシュパーティションテーブルの作成
構文
CREATE TABLE [schema.]table_name
table_definition
PARTITION BY LIST [COLUMNS] (expr)
SUBPARTITION BY ...
(list_partition_definition[, ..., list_partition_definition],
default_partition_definition
)ここで、default_partition_definition は以下のとおりです。
PARTITION partition_name DEFAULT [PARTITIONS number]パーティション内にデフォルトサブパーティションを追加するには、以下を指定します。
SUBPARTITION subpartition_name DEFAULTパラメーター
| パラメーター | 説明 |
|---|---|
table_name | テーブル名です。 |
partition_name | 単一のデフォルトパーティションの場合:他のすべてのパーティション名と重複しないパーティション名を指定します。複数のデフォルトパーティションの場合:名前のプレフィックスを指定します。実際のパーティション名は partition_name0、partition_name1 のように自動付与されます。 |
subpartition_name | サブパーティション名です。テーブル内で一意である必要があります。各パーティションは最大で 1 つの DEFAULT サブパーティションのみをサポートします。 |
number | ハッシュ規則を使用する場合のデフォルトパーティション数です。省略可能であり、省略した場合は単一のデフォルトパーティションが作成されます。 |
例
単一のデフォルトパーティションの作成
1–10 の範囲外の値を持つすべての行は、pd パーティションに格納されます。
CREATE TABLE list_default (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT);複数のデフォルトパーティションの作成
マッチしなかった行は、ハッシュ規則により 3 つのデフォルトパーティション(pd0、pd1、pd2)に分散されます。
CREATE TABLE list_default_hash (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT PARTITIONS 3);EXPLAIN を実行して、パーティション構成を確認します。
EXPLAIN SELECT * FROM list_default_hash;期待される出力:
+----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | list_default_hash | p0,p1,pd0,pd1,pd2 | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
+----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set (0.04 sec)VARCHAR 列を含む複数のデフォルトパーティションの作成
CREATE TABLE t_goods
(
country VARCHAR(30),
year VARCHAR(60),
goods TEXT
) PARTITION BY LIST COLUMNS(country)
(
PARTITION p1 VALUES IN ('China'),
PARTITION p2 VALUES IN ('USA'),
PARTITION p3 VALUES IN ('Asia'),
PARTITION p3 VALUES IN ('Singapore'),
PARTITION p_deft DEFAULT PARTITIONS 5
);デフォルトサブパーティションを含むテーブルの作成
デフォルトパーティションが 1 つのみの場合、サブパーティションの種類は任意です。以下の例では、各パーティションに 1 つのデフォルトサブパーティションを含むリストサブパーティションを使用しています。
CREATE TABLE test (a INT, b INT)
PARTITION BY RANGE(a)
SUBPARTITION BY LIST(b) (
PARTITION part0 VALUES LESS THAN (10)
( SUBPARTITION sub0 VALUES IN (1,2,3,4,5),
SUBPARTITION sub1 DEFAULT),
PARTITION part1 VALUES LESS THAN (20)
( SUBPARTITION sub2 VALUES IN (1,2,3,4,5),
SUBPARTITION sub3 DEFAULT),
PARTITION part2 VALUES LESS THAN (30)
( SUBPARTITION sub4 VALUES IN (1,2,3,4,5),
SUBPARTITION sub5 DEFAULT));複数のデフォルトパーティションにまたがるハッシュサブパーティションを含むテーブルの作成
複数のデフォルトパーティションが存在する場合、サポートされるサブパーティションの種類はハッシュまたはキーのみです。
CREATE TABLE list_default_hash_sub (
a INT,
b INT
)
PARTITION BY LIST (a)
SUBPARTITION BY HASH (b) SUBPARTITIONS 20
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT PARTITIONS 3);リスト・デフォルト・ハッシュパーティションテーブルの変更
リスト・デフォルト・ハッシュパーティションテーブルでは、以下の ALTER TABLE 文がサポートされています:ADD PARTITION、DROP PARTITION、REORGANIZE PARTITION、TRUNCATE PARTITION、EXCHANGE PARTITION、OPTIMIZE PARTITION、REBUILD PARTITION、REPAIR PARTITION、ANALYZE PARTITION、および CHECK PARTITION。
以下では、ADD PARTITION、DROP PARTITION、および REORGANIZE PARTITION について説明します。その他の文については、「パーティションテーブルの変更」をご参照ください。
パーティションの追加
デフォルトパーティションの追加
現在リストパーティションのみを持つテーブルの場合、デフォルトパーティションを追加することで、リスト・デフォルト・ハッシュパーティションテーブルに変換できます。
ALTER TABLE table_name ADD PARTITION (default_partition_definition)1 つのデフォルトパーティションの追加
CREATE TABLE list_tab (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10)
);
ALTER TABLE list_tab ADD PARTITION (PARTITION pd DEFAULT);2 つのデフォルトパーティションの追加
CREATE TABLE list_tab (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10)
);
ALTER TABLE list_tab ADD PARTITION (PARTITION pd DEFAULT PARTITIONS 2);リストパーティションの追加
PolarDB for MySQL 8.0.2.2.11 以降で利用可能です。
新しいリストパーティションを追加すると、通常は、既存の行が新しいパーティションに属さないことを確認するために、デフォルトパーティション全体がスキャンされます。デフォルトパーティションに大量のデータが含まれている場合、このスキャンには時間がかかる可能性があります。これを回避するには、ステートメント末尾に WITHOUT VALIDATION を追加します。ただし、デフォルトパーティションに新しいリスト値に一致するデータが**確実に存在しない**場合にのみ使用してください。
該当するデータの有無が確認できない場合は、代わりに ALTER TABLE REORGANIZE PARTITION を使用して、新しいリストパーティションを追加する前に、マッチするデータをデフォルトパーティションから分割してください。
ALTER TABLE table_name ADD PARTITION (
list_partition_definition[, ..., list_partition_definition])
WITHOUT VALIDATION例
CREATE TABLE list_default_hash (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT PARTITIONS 3);
ALTER TABLE list_default_hash ADD PARTITION (
PARTITION p2 VALUES IN (11,12,13)
) WITHOUT VALIDATION;このステートメント実行後、p2 パーティションが list_default_hash に追加されますが、データは含まれません。
WITHOUT VALIDATION を使用する際は、デフォルトパーティションに a の値が 11、12、または 13 である行が**存在しないこと**を確認してください。存在する場合、これらの行は新しいリストパーティション追加後に到達不能になります。
パーティションの削除
DROP PARTITION の詳細については、「DROP PARTITION」をご参照ください。
DROP PARTITION は、すべてのデフォルトパーティションを一度に削除します。一部のデフォルトパーティションのみを削除することはサポートされていません。
すべてのデフォルトパーティションの削除
ALTER TABLE list_default_hash DROP PARTITION pd0,pd1,pd2;Query OK, 0 rows affected (0.33 sec)
Records: 0 Duplicates: 0 Warnings: 0エラー:デフォルトパーティションの一部のみを削除しようとした場合
一部のデフォルトパーティションのみを削除しようとすると、エラーが発生します。
ALTER TABLE list_default_hash DROP PARTITION pd0;ERROR 8078 (HY000): DROP PARTITION cannot be used on default partitions of LIST DEFAULT, except once dropping all default partitionsパーティションの再編成
REORGANIZE PARTITION の詳細については、「REORGANIZE PARTITION」をご参照ください。
REORGANIZE PARTITION は、すべてのデフォルトパーティションを一度に処理します。一部のデフォルトパーティションのみを変更することはサポートされていません。
デフォルトパーティション数の変更
以下のステートメントは、デフォルトパーティション数を 2 から 3 に増加させます。
ALTER TABLE list_default_hash
REORGANIZE PARTITION pd0, pd1
INTO (
PARTITION pd DEFAULT PARTITIONS 3);デフォルトパーティションからリストパーティションを分割
以下のステートメントは、デフォルトパーティションから p2 という新しいリストパーティションを作成し、VALUES IN (20,21) に一致する行をそこに移動します。
ALTER TABLE list_default_hash
REORGANIZE PARTITION pd0, pd1
INTO (
PARTITION p2 VALUES IN (20,21),
PARTITION pd DEFAULT PARTITIONS 2);リストパーティションをデフォルトパーティションに統合
以下のステートメントは、リストパーティション p2 のすべての行をデフォルトパーティションに戻します。
ALTER TABLE list_default_hash
REORGANIZE PARTITION p2, pd0, pd1
INTO (
PARTITION pd DEFAULT PARTITIONS 2);リストパーティションの値セットの拡張
以下のステートメントは、p2 の定義を VALUES IN (20,21) から VALUES IN (20,21,22,23,24) に拡張します。デフォルトパーティションに存在し、新しい値に一致する行は p2 に移動されます。
ALTER TABLE list_default
REORGANIZE PARTITION p2, pd0, pd1
INTO (
PARTITION p2 VALUES IN (20,21,22,23,24),
PARTITION pd DEFAULT PARTITIONS 4);