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

PolarDB:パーティションの再編成

最終更新日:Mar 28, 2026

REORGANIZE PARTITION を使用すると、データ損失を伴わず、複数のパーティションを少数のパーティションにマージしたり、単一のパーティションを多数のパーティションに分割したりできます。PolarDB-X は、既存の行を自動的に新しいパーティション定義に再配分します。

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

  • レベル 1 パーティションの再編成には、バージョン 5.4.14-16539836 以降の PolarDB-X インスタンスが必要です。

  • レベル 2 パーティションの再編成には、バージョン 5.4.17-16952556 以降の PolarDB-X インスタンスが必要です。

制限事項

制約詳細
サポートされていないパーティションタイプHASH、KEY、CO_HASH パーティションは再編成できません。
境界値のカバー範囲新しいパーティション定義は、元のパーティションと完全に同一の境界値範囲をカバーする必要があります。RANGE パーティションの場合、最終的な VALUES LESS THAN 境界値は、最後の元パーティションのものと一致しなければなりません。LIST パーティションの場合、すべての VALUES IN セットの和集合が完全に同一である必要があります。
非テンプレート型レベル 2 の制約非テンプレート型レベル 2 パーティションを含むレベル 1 パーティションを再編成する場合、INTO 句でも非テンプレート型レベル 2 パーティションを定義する必要があります。
テンプレート型レベル 2 の適用範囲テンプレート型レベル 2 パーティションの再編成は、すべてのレベル 1 パーティションに対して同時に適用されます。

基本概念

テーブルグループ:同一のパーティションキー列を共有する論理テーブルまたはグローバルインデックステーブルのコレクションです。テーブルグループの再編成は、そのグループ内のすべてのテーブルに対して一度に実行されます。

グローバルインデックス:パーティションキー以外の列に基づいて構築された、パーティション化テーブルのインデックスです。グローバルインデックスは、すべてのパーティションにわたって一意性制約を適用できます。

レベル 1 パーティション:多段パーティション化テーブルにおける最上位のパーティションです。

レベル 2 パーティション(サブパーティション):レベル 1 パーティション内にネストされたパーティションです。テンプレート型(すべてのレベル 1 パーティションに同一の定義が適用される)または非テンプレート型(各レベル 1 パーティションごとに個別に定義される)のいずれかになります。

構文

ALTER alter_target_definition reorg_partition_operation_definition

alter_target_definition:
    TABLE [db_name.]tbl_name
  | TABLE tbl_name.index_name
  | TABLEGROUP tg_name
  | INDEX index_name ON TABLE [db_name.]tbl_name
  | TABLEGROUP BY TABLE [db_name.]tbl_name
  | TABLEGROUP BY INDEX index_name ON TABLE [db_name.]tbl_name

reorg_partition_operation_definition:
    REORGANIZE PARTITION part_name_list INTO (partition_specs_definition)
  | REORGANIZE SUBPARTITION subpart_name_list INTO (subpartition_specs_definition)
  | MODIFY PARTITION part_name REORGANIZE SUBPARTITION subpart_name_list INTO (subpartition_specs_definition)

part_name_list:
  part_name [, part_name, ...]

subpart_name_list:
  subpart_name [, subpart_name, ...]

partition_specs_definition:
    range_partition_list
  | list_partition_list

subpartition_specs_definition:
    range_subpartition_list
  | list_subpartition_list

range_partition_list:
  (range_partition [, range_partition, ...])

range_partition:
  PARTITION partition_name VALUES LESS THAN (range_bound_value)

-- RANGE または RANGE COLUMNS のレベル 2 パーティションを指定します。
range_subpartition_list:
  (range_subpartition [, range_subpartition, ...])

range_subpartition:
  SUBPARTITION subpartition_name VALUES LESS THAN (range_bound_value) [partition_spec_options]

list_partition_list:
  (list_partition [, list_partition, ...])

list_partition:
  PARTITION partition_name VALUES IN (list_bound_value) [partition_spec_options]

-- LIST または LIST COLUMNS のレベル 2 パーティションを指定します。
list_subpartition_list:
  (list_subpartition [, list_subpartition, ...])

list_subpartition:
  SUBPARTITION subpartition_name VALUES IN (list_bound_value) [partition_spec_options]

ALTER 文は、単一のテーブル、名前付きテーブルグループ、またはグローバルインデックスのいずれかを対象としています。REORGANIZE PARTITION はレベル 1 パーティション用、REORGANIZE SUBPARTITION はレベル 2 パーティション用です。

シナリオ 1:レベル 1 パーティションの再編成(レベル 2 パーティションなし)

例 1:RANGE レベル 1 パーティションのマージおよび分割

以下のテーブルは、RANGE(YEAR(c)) で 4 つのパーティションに分割されています。

CREATE TABLE `r_t1` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
(
  PARTITION p0 VALUES LESS THAN (2020),
  PARTITION p1 VALUES LESS THAN (2023),
  PARTITION p2 VALUES LESS THAN (2025),
  PARTITION p3 VALUES LESS THAN (2027)
);

CREATE TABLE `r_t2` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
(
  PARTITION p0 VALUES LESS THAN (2020),
  PARTITION p1 VALUES LESS THAN (2023),
  PARTITION p2 VALUES LESS THAN (2025),
  PARTITION p3 VALUES LESS THAN (2027)
);

以下の文では、p1p2p3(2020 年~2027 年をカバー)を、2 つの新しいパーティション p4 および p5 にマージします。新しいパーティションの合計範囲は元の範囲と一致しており、p4 は 2024 年まで、p5 は 2027 年までをカバーします。

テーブル名で単一テーブルを対象とする:

ALTER TABLE r_t1
  REORGANIZE PARTITION p1, p2, p3 INTO
  (
    PARTITION p4 VALUES LESS THAN (2024),
    PARTITION p5 VALUES LESS THAN (2027)
  );

テーブルグループ名でテーブルグループ内のすべてのテーブルを対象とする:

-- テーブルグループ tg1 内のすべてのテーブル(r_t1 および r_t2 を含む)に適用されます。
ALTER TABLEGROUP tg1
  REORGANIZE PARTITION p1, p2, p3 INTO
  (
    PARTITION p4 VALUES LESS THAN (2024),
    PARTITION p5 VALUES LESS THAN (2027)
  );

テーブル名でテーブルグループ内のすべてのテーブルを対象とする:

-- PolarDB-X はテーブル名から自動的にテーブルグループを特定し、
-- そのグループ内のすべてのテーブルに再編成を適用します。
ALTER TABLEGROUP BY TABLE r_t1
  REORGANIZE PARTITION p1, p2, p3 INTO
  (
    PARTITION p4 VALUES LESS THAN (2024),
    PARTITION p5 VALUES LESS THAN (2027)
  );

例 2:LIST レベル 1 パーティションのマージおよび分割

以下のテーブルは、LIST(YEAR(c)) でパーティション化されています。

CREATE TABLE `l_t1` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY LIST(YEAR(`c`))
(
  PARTITION p0 VALUES IN (2020, 2022, 2024, 2026, 2028),
  PARTITION p1 VALUES IN (2021, 2023, 2025, 2027, 2029),
  PARTITION p2 VALUES IN (2030, 2031, 2032)
);

CREATE TABLE `l_t2` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY LIST(YEAR(`c`))
(
  PARTITION p0 VALUES IN (2020, 2022, 2024, 2026, 2028),
  PARTITION p1 VALUES IN (2021, 2023, 2025, 2027, 2029),
  PARTITION p2 VALUES IN (2030, 2031, 2032)
);

以下の文では、p0 および p1(2020 年~2029 年をカバー)を、連続した年をグループ化した p3 および p4 にマージします。新しい VALUES IN セットの和集合は、元のものと完全に一致します。

単一テーブルを対象とする:

ALTER TABLE l_t1
  REORGANIZE PARTITION p0, p1 INTO
  (
    PARTITION p3 VALUES IN (2020, 2021, 2022, 2023, 2024),
    PARTITION p4 VALUES IN (2025, 2026, 2027, 2028, 2029)
  );

テーブルグループ名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP tg1
  REORGANIZE PARTITION p0, p1 INTO
  (
    PARTITION p3 VALUES IN (2020, 2021, 2022, 2023, 2024),
    PARTITION p4 VALUES IN (2025, 2026, 2027, 2028, 2029)
  );

テーブル名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP BY TABLE l_t1
  REORGANIZE PARTITION p0, p1 INTO
  (
    PARTITION p3 VALUES IN (2020, 2021, 2022, 2023, 2024),
    PARTITION p4 VALUES IN (2025, 2026, 2027, 2028, 2029)
  );

シナリオ 2:レベル 2 パーティションを含むレベル 1 パーティションの再編成

例 1:レベル 1 パーティションの再編成と新しいレベル 2 パーティションの定義

これは、非テンプレート型レベル 2 パーティションを持つテーブルにのみ適用されます。INTO 句内の新しいパーティション定義も、非テンプレート型でなければなりません。

以下の RANGE-KEY パーティションテーブルは、非テンプレート型レベル 2 パーティションを持ちます。

CREATE TABLE `r_k_ntp_t1` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
SUBPARTITION BY KEY(a)
(
  PARTITION p0 VALUES LESS THAN (2020) SUBPARTITIONS 2,
  PARTITION p1 VALUES LESS THAN (2021) SUBPARTITIONS 4,
  PARTITION p2 VALUES LESS THAN (2022) SUBPARTITIONS 2,
  PARTITION p3 VALUES LESS THAN (2023) SUBPARTITIONS 3
);

CREATE TABLE `r_k_ntp_t2` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
SUBPARTITION BY KEY(a)
(
  PARTITION p0 VALUES LESS THAN (2020) SUBPARTITIONS 2,
  PARTITION p1 VALUES LESS THAN (2021) SUBPARTITIONS 4,
  PARTITION p2 VALUES LESS THAN (2022) SUBPARTITIONS 2,
  PARTITION p3 VALUES LESS THAN (2023) SUBPARTITIONS 3
);

以下の文では、p1 および p2 を、1 つのサブパーティションを持つ新しいパーティション p4 にマージします。

単一テーブルを対象とする:

ALTER TABLE r_k_ntp_t1
  REORGANIZE PARTITION p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (2022) SUBPARTITIONS 1
  );

テーブルグループ名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP tg1
  REORGANIZE PARTITION p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (2022) SUBPARTITIONS 1
  );

テーブル名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP BY TABLE r_k_ntp_t1
  REORGANIZE PARTITION p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (2022) SUBPARTITIONS 1
  );

例 2:レベル 2 パーティションを再定義せずにレベル 1 パーティションを再編成

これは、テンプレート型および非テンプレート型の両方のレベル 2 パーティションに適用されます。

単一テーブルを対象とする:

ALTER TABLE r_k_ntp_t1
  REORGANIZE PARTITION p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (2022)
  );

テーブルグループ名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP tg1
  REORGANIZE PARTITION p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (2022)
  );

テーブル名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP BY TABLE r_k_ntp_t1
  REORGANIZE PARTITION p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (2022)
  );

シナリオ 3:テンプレート型レベル 2 パーティションの再編成

テンプレート型レベル 2 パーティションの再編成は、すべてのレベル 1 パーティション下の対応するサブパーティションに同時に適用されます。

例 1:RANGE レベル 2 パーティションのマージおよび分割

以下の KEY-RANGE パーティションテーブルは、テンプレート型レベル 2 パーティションを持ちます。

CREATE TABLE `k_r_tp_t1` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY RANGE(`b`)
(
  SUBPARTITION sp0 VALUES LESS THAN (1000),
  SUBPARTITION sp1 VALUES LESS THAN (2000),
  SUBPARTITION sp2 VALUES LESS THAN (3000),
  SUBPARTITION sp3 VALUES LESS THAN (4000)
);

CREATE TABLE `k_r_tp_t2` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY RANGE(`b`)
(
  SUBPARTITION sp0 VALUES LESS THAN (1000),
  SUBPARTITION sp1 VALUES LESS THAN (2000),
  SUBPARTITION sp2 VALUES LESS THAN (3000),
  SUBPARTITION sp3 VALUES LESS THAN (4000)
);

以下の文では、sp1 および sp2(値 1000~3000 をカバー)を、3 つのサブパーティション sp4sp5sp6 に分割します。この再編成は、すべてのレベル 1 パーティション下で同時に適用されます。

単一テーブルを対象とする:

ALTER TABLE k_r_tp_t1
  REORGANIZE SUBPARTITION sp1, sp2 INTO
  (
    SUBPARTITION sp4 VALUES LESS THAN (2500),
    SUBPARTITION sp5 VALUES LESS THAN (2800),
    SUBPARTITION sp6 VALUES LESS THAN (3000)
  );

テーブルグループ名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP tg1
  REORGANIZE SUBPARTITION sp1, sp2 INTO
  (
    SUBPARTITION sp4 VALUES LESS THAN (2500),
    SUBPARTITION sp5 VALUES LESS THAN (2800),
    SUBPARTITION sp6 VALUES LESS THAN (3000)
  );

テーブル名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP BY TABLE k_r_tp_t1
  REORGANIZE SUBPARTITION sp1, sp2 INTO
  (
    SUBPARTITION sp4 VALUES LESS THAN (2500),
    SUBPARTITION sp5 VALUES LESS THAN (2800),
    SUBPARTITION sp6 VALUES LESS THAN (3000)
  );

例 2:LIST レベル 2 パーティションのマージおよび分割

以下の KEY-LIST パーティションテーブルは、テンプレート型レベル 2 パーティションを持ちます。

CREATE TABLE `k_l_tp_t1` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY LIST(YEAR(`c`))
(
  SUBPARTITION sp0 VALUES IN (2020, 2022, 2024, 2026, 2028),
  SUBPARTITION sp1 VALUES IN (2021, 2023, 2025, 2027, 2029),
  SUBPARTITION sp2 VALUES IN (2030, 2031, 2032)
);

CREATE TABLE `k_l_tp_t2` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY LIST(YEAR(`c`))
(
  SUBPARTITION sp0 VALUES IN (2020, 2022, 2024, 2026, 2028),
  SUBPARTITION sp1 VALUES IN (2021, 2023, 2025, 2027, 2029),
  SUBPARTITION sp2 VALUES IN (2030, 2031, 2032)
);

以下の文では、sp0 および sp1(2020 年~2029 年をカバー)を、連続した年をグループ化した 2 つの新しいサブパーティションにマージします。

単一テーブルを対象とする:

ALTER TABLE k_l_tp_t1
  REORGANIZE SUBPARTITION sp0, sp1 INTO
  (
    SUBPARTITION sp3 VALUES IN (2020, 2021, 2022, 2023, 2024),
    SUBPARTITION sp4 VALUES IN (2025, 2026, 2027, 2028, 2029)
  );

テーブルグループ名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP tg1
  REORGANIZE SUBPARTITION sp0, sp1 INTO
  (
    SUBPARTITION sp3 VALUES IN (2020, 2021, 2022, 2023, 2024),
    SUBPARTITION sp4 VALUES IN (2025, 2026, 2027, 2028, 2029)
  );

テーブル名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP BY TABLE k_l_tp_t1
  REORGANIZE SUBPARTITION sp0, sp1 INTO
  (
    SUBPARTITION sp3 VALUES IN (2020, 2021, 2022, 2023, 2024),
    SUBPARTITION sp4 VALUES IN (2025, 2026, 2027, 2028, 2029)
  );

シナリオ 4:非テンプレート型レベル 2 パーティションの再編成

非テンプレート型レベル 2 パーティションの場合、他のレベル 1 パーティションとは独立して、特定のレベル 1 パーティション下のサブパーティションを再編成できます。

例 1:指定されたレベル 1 パーティション下の RANGE レベル 2 パーティションの再編成

以下の LIST-RANGE パーティションテーブルは、非テンプレート型レベル 2 パーティションを持ちます。

CREATE TABLE `l_r_ntp_t1` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY LIST(`a`)
SUBPARTITION BY RANGE(`b`)
(
  PARTITION p0 VALUES IN (2020, 2022) (
    SUBPARTITION p0sp0 VALUES LESS THAN (1000),
    SUBPARTITION p0sp1 VALUES LESS THAN (2000),
    SUBPARTITION p0sp2 VALUES LESS THAN (3000),
    SUBPARTITION p0sp3 VALUES LESS THAN (4000)
  ),
  PARTITION p1 VALUES IN (2021, 2023) (
    SUBPARTITION p1sp0 VALUES LESS THAN (1500),
    SUBPARTITION p1sp1 VALUES LESS THAN (2500),
    SUBPARTITION p1sp2 VALUES LESS THAN (3500),
    SUBPARTITION p1sp3 VALUES LESS THAN (4500)
  )
);

CREATE TABLE `l_r_ntp_t2` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY LIST(`a`)
SUBPARTITION BY RANGE(`b`)
(
  PARTITION p0 VALUES IN (2020, 2022) (
    SUBPARTITION p0sp0 VALUES LESS THAN (1000),
    SUBPARTITION p0sp1 VALUES LESS THAN (2000),
    SUBPARTITION p0sp2 VALUES LESS THAN (3000),
    SUBPARTITION p0sp3 VALUES LESS THAN (4000)
  ),
  PARTITION p1 VALUES IN (2021, 2023) (
    SUBPARTITION p1sp0 VALUES LESS THAN (1500),
    SUBPARTITION p1sp1 VALUES LESS THAN (2500),
    SUBPARTITION p1sp2 VALUES LESS THAN (3500),
    SUBPARTITION p1sp3 VALUES LESS THAN (4500)
  )
);

以下の文では、p0sp1 および p0sp2(値 1000~3000 をカバー)を、パーティション p0 下で 3 つのサブパーティションに分割します。p0 下のサブパーティションのみが影響を受け、p1 は変更されません。

単一テーブルを対象とする:

ALTER TABLE l_r_ntp_t1
  REORGANIZE SUBPARTITION p0sp1, p0sp2 INTO
  (
    SUBPARTITION p0sp4 VALUES LESS THAN (2500),
    SUBPARTITION p0sp5 VALUES LESS THAN (2800),
    SUBPARTITION p0sp6 VALUES LESS THAN (3000)
  );

テーブルグループ名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP tg1
  REORGANIZE SUBPARTITION p0sp1, p0sp2 INTO
  (
    SUBPARTITION p0sp4 VALUES LESS THAN (2500),
    SUBPARTITION p0sp5 VALUES LESS THAN (2800),
    SUBPARTITION p0sp6 VALUES LESS THAN (3000)
  );

テーブル名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP BY TABLE l_r_ntp_t1
  REORGANIZE SUBPARTITION p0sp1, p0sp2 INTO
  (
    SUBPARTITION p0sp4 VALUES LESS THAN (2500),
    SUBPARTITION p0sp5 VALUES LESS THAN (2800),
    SUBPARTITION p0sp6 VALUES LESS THAN (3000)
  );

例 2:指定されたレベル 1 パーティション下の LIST レベル 2 パーティションの再編成

以下の RANGE-LIST パーティションテーブルは、非テンプレート型レベル 2 パーティションを持ちます。

CREATE TABLE `r_l_ntp_t1` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
SUBPARTITION BY LIST(`b`)
(
  PARTITION p0 VALUES LESS THAN (2020) (
    SUBPARTITION p0sp0 VALUES IN (2020, 2022, 2024, 2026, 2028),
    SUBPARTITION p0sp1 VALUES IN (2021, 2023, 2025, 2027, 2029),
    SUBPARTITION p0sp2 VALUES IN (2030, 2031)
  ),
  PARTITION p1 VALUES LESS THAN (2022) (
    SUBPARTITION p1sp0 VALUES IN (2020, 2022, 2024, 2026, 2028),
    SUBPARTITION p1sp1 VALUES IN (2021, 2023, 2025, 2027, 2029),
    SUBPARTITION p1sp2 VALUES IN (2030)
  )
);

CREATE TABLE `r_l_ntp_t2` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
SUBPARTITION BY LIST(`b`)
(
  PARTITION p0 VALUES LESS THAN (2020) (
    SUBPARTITION p0sp0 VALUES IN (2020, 2022, 2024, 2026, 2028),
    SUBPARTITION p0sp1 VALUES IN (2021, 2023, 2025, 2027, 2029),
    SUBPARTITION p0sp2 VALUES IN (2030, 2031)
  ),
  PARTITION p1 VALUES LESS THAN (2022) (
    SUBPARTITION p1sp0 VALUES IN (2020, 2022, 2024, 2026, 2028),
    SUBPARTITION p1sp1 VALUES IN (2021, 2023, 2025, 2027, 2029),
    SUBPARTITION p1sp2 VALUES IN (2030)
  )
);

以下の文では、p0sp0 および p0sp1(2020 年~2029 年をカバー)を、パーティション p0 下で 2 つの新しいサブパーティションにマージします。p1 下のサブパーティションは影響を受けません。

単一テーブルを対象とする:

ALTER TABLE r_l_ntp_t1
  REORGANIZE SUBPARTITION p0sp0, p0sp1 INTO
  (
    SUBPARTITION p0sp4 VALUES IN (2020, 2021, 2022, 2023, 2024),
    SUBPARTITION p0sp5 VALUES IN (2025, 2026, 2027, 2028, 2029)
  );

テーブルグループ名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP tg1
  REORGANIZE SUBPARTITION p0sp0, p0sp1 INTO
  (
    SUBPARTITION p0sp4 VALUES IN (2020, 2021, 2022, 2023, 2024),
    SUBPARTITION p0sp5 VALUES IN (2025, 2026, 2027, 2028, 2029)
  );

テーブル名でテーブルグループ内のすべてのテーブルを対象とする:

ALTER TABLEGROUP BY TABLE r_l_ntp_t1
  REORGANIZE SUBPARTITION p0sp0, p0sp1 INTO
  (
    SUBPARTITION p0sp4 VALUES IN (2020, 2021, 2022, 2023, 2024),
    SUBPARTITION p0sp5 VALUES IN (2025, 2026, 2027, 2028, 2029)
  );

シナリオ 5:グローバルインデックステーブルのパーティション再編成

例 1:グローバルインデックスの RANGE レベル 1 パーティションの再編成

テーブル r_gr_t1 には、g_r というグローバルインデックスがあり、これは RANGE(a) でパーティション化されています。

CREATE TABLE `r_gr_t1` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL,
  GLOBAL INDEX `g_r` (`a`) COVERING (`c`)
    PARTITION BY RANGE(`a`)
    (
      PARTITION `p0` VALUES LESS THAN (10000),
      PARTITION `p1` VALUES LESS THAN (20000),
      PARTITION `p2` VALUES LESS THAN (30000),
      PARTITION `p3` VALUES LESS THAN (40000)
    )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
(
  PARTITION `p0` VALUES LESS THAN (2020),
  PARTITION `p1` VALUES LESS THAN (2021)
);

以下の文では、p0p1p2(最大値 30000 をカバー)を、g_r グローバルインデックス内で 2 つの新しいパーティション p4 および p5 にマージします。

テーブル名とインデックス名でグローバルインデックスを対象とする:

-- table_name.index_name の形式を使用します。
ALTER TABLE `r_gr_t1`.`g_r`
  REORGANIZE PARTITION p0, p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (15000),
    PARTITION p5 VALUES LESS THAN (30000)
  );

-- または、INDEX index_name ON TABLE table_name を使用します。
ALTER INDEX `g_r` ON TABLE `r_gr_t1`
  REORGANIZE PARTITION p0, p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (15000),
    PARTITION p5 VALUES LESS THAN (30000)
  );

テーブルグループ名でテーブルグループ内のすべてのグローバルインデックステーブルを対象とする:

-- tg1 は、グローバルインデックステーブルが属するテーブルグループです。
ALTER TABLEGROUP tg1
  REORGANIZE PARTITION p0, p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (15000),
    PARTITION p5 VALUES LESS THAN (30000)
  );

インデックス名とテーブル名でテーブルグループ内のすべてのグローバルインデックステーブルを対象とする:

ALTER TABLEGROUP BY INDEX `g_r` ON TABLE `r_gr_t1`
  REORGANIZE PARTITION p0, p1, p2 INTO
  (
    PARTITION p4 VALUES LESS THAN (15000),
    PARTITION p5 VALUES LESS THAN (30000)
  );

例 2:グローバルインデックスの LIST レベル 2 パーティションの再編成

テーブル r_g_kl_t1 には、テンプレート型レベル 2 パーティションを持つ KEY-LIST パーティション方式のグローバルインデックス g_kl があります。

CREATE TABLE `r_g_kl_t1` (
  `a` bigint(20) UNSIGNED NOT NULL,
  `b` bigint(20) UNSIGNED NOT NULL,
  `c` datetime NOT NULL,
  `d` varchar(16) NOT NULL,
  `e` varchar(16) NOT NULL,
  GLOBAL INDEX `g_kl` (`a`, `b`) COVERING (`c`)
    PARTITION BY KEY(`b`) PARTITIONS 2
    SUBPARTITION BY LIST(`a`)
    (
      SUBPARTITION `sp0` VALUES IN (10000, 10002, 10004, 10006, 10008),
      SUBPARTITION `sp1` VALUES IN (20000, 20001, 20002, 20003, 20004),
      SUBPARTITION `sp2` VALUES IN (30000, 30001, 30002)
    )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
(
  PARTITION `p0` VALUES LESS THAN (2020),
  PARTITION `p1` VALUES LESS THAN (2021)
);

以下の文では、sp1 および sp2(値 20000~30002 をカバー)を、g_kl グローバルインデックス内で 2 つの新しいサブパーティション sp4 および sp5 にマージします。

テーブル名とインデックス名でグローバルインデックスを対象とする:

ALTER TABLE `r_g_kl_t1`.`g_kl`
  REORGANIZE SUBPARTITION sp1, sp2 INTO
  (
    SUBPARTITION `sp4` VALUES IN (20000, 20001, 20002),
    SUBPARTITION `sp5` VALUES IN (20003, 20004, 30000, 30001, 30002)
  );

ALTER INDEX g_kl ON TABLE `r_g_kl_t1`
  REORGANIZE SUBPARTITION sp1, sp2 INTO
  (
    SUBPARTITION `sp4` VALUES IN (20000, 20001, 20002),
    SUBPARTITION `sp5` VALUES IN (20003, 20004, 30000, 30001, 30002)
  );

テーブルグループ名でテーブルグループ内のすべてのグローバルインデックステーブルを対象とする:

-- tg1 は、グローバルインデックステーブルが属するテーブルグループです。
ALTER TABLEGROUP tg1
  REORGANIZE SUBPARTITION sp1, sp2 INTO
  (
    SUBPARTITION `sp4` VALUES IN (20000, 20001, 20002),
    SUBPARTITION `sp5` VALUES IN (20003, 20004, 30000, 30001, 30002)
  );

インデックス名とテーブル名でテーブルグループ内のすべてのグローバルインデックステーブルを対象とする:

ALTER TABLEGROUP BY INDEX `g_kl` ON TABLE `r_g_kl_t1`
  REORGANIZE SUBPARTITION sp1, sp2 INTO
  (
    SUBPARTITION `sp4` VALUES IN (20000, 20001, 20002),
    SUBPARTITION `sp5` VALUES IN (20003, 20004, 30000, 30001, 30002)
  );