すべてのプロダクト
Search
ドキュメントセンター

PolarDB:LIST DEFAULT HASH

最終更新日:Mar 29, 2026

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

LIST DEFAULT HASH

仕組み

  1. 各挿入行は、リストパーティション規則に対して評価されます。

  2. VALUES IN 句に一致する行は、対応するリストパーティションに格納されます。

  3. どのリスト規則にも一致しない行は、デフォルトパーティションに格納されます。

  4. 複数のデフォルトパーティションが存在する場合、ハッシュ規則により、マッチしなかった行がそれらのパーティションに分散されます。

バージョン要件

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_name0partition_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 つのデフォルトパーティション(pd0pd1pd2)に分散されます。

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 PARTITIONDROP PARTITIONREORGANIZE PARTITIONTRUNCATE PARTITIONEXCHANGE PARTITIONOPTIMIZE PARTITIONREBUILD PARTITIONREPAIR PARTITIONANALYZE PARTITION、および CHECK PARTITION

以下では、ADD PARTITIONDROP 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 の値が 1112、または 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);

次のステップ

リスト・デフォルト・ハッシュパーティショニングの適用タイミング