MySQL 8.0 リファレンスマニュアル


13.1.9.1 ALTER TABLE パーティション操作

ALTER TABLE のパーティション関連の句をパーティションテーブルとともに使用して、パーティションの再パーティション化、パーティションの追加、削除、破棄、インポート、マージおよび分割、パーティション化メンテナンスの実行を行うことができます。

  • 単に、パーティション化されたテーブルに対して ALTER TABLEpartition_options 句を使用するだけで、partition_options で定義されたパーティション化スキームに従って、そのテーブルが再パーティション化されます。 この句は常に PARTITION BY で始まり、CREATE TABLEpartition_options 句に適用されるものと同じ構文およびその他のルールに従い (詳細は、セクション13.1.20「CREATE TABLE ステートメント」 を参照)、まだパーティション化されていない既存のテーブルのパーティション化にも使用できます。 たとえば、次に示すように定義された (パーティション化されていない) テーブルを考えてみます。

    CREATE TABLE t1 (
        id INT,
        year_col INT
    );

    このテーブルは、次のステートメントを使用し、id カラムをパーティション化キーとして使用して HASH によって 8 つのパーティションにパーティション化できます。

    ALTER TABLE t1
        PARTITION BY HASH(id)
        PARTITIONS 8;

    MySQL は、[SUB]PARTITION BY [LINEAR] KEYALGORITHM オプションをサポートしています。 ALGORITHM=1 を指定すると、サーバーは、パーティション内の行の配置を計算するときに MySQL 5.1 と同じキーハッシュ関数を使用します。ALGORITHM=2 は、サーバーが、MySQL 5.5 以降で実装され、KEY によってパーティション化された新しいテーブルに対してデフォルトで使用されるキーハッシュ関数を使用することを示します。 (MySQL 5.5 以降で採用されたキーハッシュ関数によって作成されたパーティション化されたテーブルを MySQL 5.1 サーバーで使用することはできません。) このオプションを指定しない場合は、ALGORITHM=2 を使用するのと同じ効果があります。 このオプションは、主に [LINEAR] KEY によってパーティション化されたテーブルを MySQL 5.1 以降の MySQL バージョン間でアップグレードまたはダウングレードするときに使用するか、または MySQL 5.5 以降のサーバー上で、MySQL 5.1 サーバー上で使用できる KEY または LINEAR KEY によってパーティション化されたテーブルを作成することを目的にしています。

    ALTER TABLE ... PARTITION BY ステートメントを使用して作成されたテーブルは、CREATE TABLE ... PARTITION BY を使用して作成されたテーブルと同じルールに従う必要があります。 これには、そのテーブルに含まれている可能性のあるすべての一意のキー (すべての主キーを含む) と、パーティショニング式で使用されている 1 つまたは複数のカラムの間の関係を管理するルールが含まれます。これについては、セクション24.6.1「パーティショニングキー、主キー、および一意キー」で説明されています。 また、パーティションの数を指定するための CREATE TABLE ... PARTITION BY のルールも ALTER TABLE ... PARTITION BY に適用されます。

    ALTER TABLE ADD PARTITIONpartition_definition 句は、CREATE TABLE ステートメントの同じ名前の句と同じオプションをサポートしています。 (構文と説明については、セクション13.1.20「CREATE TABLE ステートメント」を参照してください。) 次に示すように作成されたパーティション化されたテーブルがあるとします。

    CREATE TABLE t1 (
        id INT,
        year_col INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999)
    );

    このテーブルに、2002 より小さい値を格納するための新しいパーティション p3 を次のように追加できます。

    ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));

    DROP PARTITION を使用すると、1 つ以上の RANGE または LIST パーティションを削除できます。 このステートメントは、HASH または KEY パーティションでは使用できません。かわりに、COALESCE PARTITION を使用してください (このセクションの後半を参照)。 partition_names リストで名前が指定されている削除されたパーティションに格納されていたデータはすべて破棄されます。 たとえば、前に定義されたテーブル t1 の場合は、p0 および p1 という名前のパーティションを次に示すように削除できます。

    ALTER TABLE t1 DROP PARTITION p0, p1;
    注記

    DROP PARTITION は、NDB ストレージエンジンを使用するテーブルでは機能しません。 セクション24.3.1「RANGE および LIST パーティションの管理」およびセクション23.1.7「NDB Cluster の既知の制限事項」を参照してください。

    ADD PARTITIONDROP PARTITION は現在、IF [NOT] EXISTS をサポートしていません。

    DISCARD PARTITION ... TABLESPACE および IMPORT PARTITION ... TABLESPACE オプションは、Transportable Tablespace 機能を個々の InnoDB テーブルパーティションに拡張します。 各 InnoDB テーブルパーティションには、独自のテーブルスペースファイル (.ibd ファイル) があります。 Transportable Tablespace 機能を使用すると、実行中の MySQL サーバーインスタンスから別の実行中のインスタンスにテーブルスペースを簡単にコピーしたり、同じインスタンスでリストアを実行できます。 どちらのオプションも、1 つ以上のパーティション名のカンマ区切りリストを取ります。 例:

    ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;
    ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;

    サブパーティションテーブルで DISCARD PARTITION ... TABLESPACE および IMPORT PARTITION ... TABLESPACE を実行する場合、パーティション名とサブパーティション名の両方が許可されます。 パーティション名を指定すると、そのパーティションのサブパーティションが含まれます。

    Transportable Tablespace 機能では、パーティション InnoDB テーブルのコピーまたはリストアもサポートされています。 詳細は、セクション15.6.1.3「InnoDB テーブルのインポート」を参照してください。

    パーティションテーブルの名前変更はサポートされています。 ALTER TABLE ... REORGANIZE PARTITION を使用して個々のパーティションの名前を間接的に変更できますが、この操作ではパーティションデータがコピーされます。

    選択したパーティションから行を削除するには、TRUNCATE PARTITION オプションを使用します。 このオプションは、1 つ以上のカンマ区切りのパーティション名のリストを取ります。 次のステートメントによって作成されたテーブル t1 について考えてみます:

    CREATE TABLE t1 (
        id INT,
        year_col INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999),
        PARTITION p3 VALUES LESS THAN (2003),
        PARTITION p4 VALUES LESS THAN (2007)
    );

    パーティション p0 からすべての行を削除するには、次のステートメントを使用します:

    ALTER TABLE t1 TRUNCATE PARTITION p0;

    今示したステートメントには、次の DELETE ステートメントと同じ効果があります。

    DELETE FROM t1 WHERE year_col < 1991;

    複数のパーティションを切り詰める場合、パーティションが連続している必要はありません。これにより、通常、DELETE ステートメントで実行された場合は非常に複雑な WHERE 条件が必要になる、パーティション化されたテーブルでの削除操作が大幅に簡素化される可能性があります。 たとえば、次のステートメントは、パーティション p1p3 のすべての行を削除します。

    ALTER TABLE t1 TRUNCATE PARTITION p1, p3;

    同等の DELETE ステートメントを次に示します。

    DELETE FROM t1 WHERE
        (year_col >= 1991 AND year_col < 1995)
        OR
        (year_col >= 2003 AND year_col < 2007);

    パーティション名のリストのかわりに ALL キーワードを使用すると、ステートメントはすべてのテーブルパーティションに対して機能します。

    TRUNCATE PARTITION は行を削除するだけです。そのテーブル自体や、どのパーティションの定義も変更されません。

    行が削除されたことを確認するには、次のようなクエリーを使用して INFORMATION_SCHEMA.PARTITIONS テーブルを確認します:

    SELECT PARTITION_NAME, TABLE_ROWS
        FROM INFORMATION_SCHEMA.PARTITIONS
        WHERE TABLE_NAME = 't1';

    HASH または KEY によってパーティション化されたテーブルで COALESCE PARTITION を使用すると、そのパーティションの数を number だけ減らすことができます。 次のようにテーブル t2 を作成したとします:

    CREATE TABLE t2 (
        name VARCHAR (30),
        started DATE
    )
    PARTITION BY HASH( YEAR(started) )
    PARTITIONS 6;

    t2 で使用されるパーティションの数を 6 から 4 に減らすには、次のステートメントを使用します:

    ALTER TABLE t2 COALESCE PARTITION 2;

    最後の number パーティションに含まれるデータは、残りのパーティションにマージされます。 この場合、パーティション 4 および 5 は最初の 4 つのパーティション (0、1、2 および 3 の番号が付けられたパーティション) にマージされます。

    パーティション化されたテーブルで使用される (すべてではなく) 一部のパーティションを変更するには、REORGANIZE PARTITION を使用できます。 このステートメントは、次のいくつかの方法で使用できます。

    • 一連のパーティションを単一パーティションにマージします。 これを行うには、partition_names リスト内の複数のパーティションに名前を付け、partition_definition の単一の定義を指定します。

    • 既存のパーティションをいくつかのパーティションに分割します。 これを実現するには、partition_names の単一のパーティションに名前を付け、複数の partition_definitions を指定します。

    • VALUES LESS THAN を使用して、定義されたパーティションのサブセットの範囲を変更するか、または VALUES IN を使用して、定義されたパーティションのサブセットの値リストを変更します。

    注記

    明示的に名前が付けられていないパーティションに対して、MySQL は自動的に p0p1p2 などのデフォルト名を付けます。 同じことがサブパーティションにも当てはまります。

    ALTER TABLE ... REORGANIZE PARTITION ステートメントの詳細および例については、セクション24.3.1「RANGE および LIST パーティションの管理」を参照してください。

  • テーブルのパーティションまたはサブパーティションをテーブルと交換するには、ALTER TABLE ... EXCHANGE PARTITION ステートメントを使用します。つまり、パーティションまたはサブパーティション内の既存の行を非パーティションテーブルに移動し、非パーティションテーブル内の既存の行をテーブルのパーティションまたはサブパーティションに移動します。

    使用方法および例については、セクション24.3.3「パーティションとサブパーティションをテーブルと交換する」を参照してください。

  • いくつかのオプションでは、CHECK TABLEREPAIR TABLE などのステートメントによって非パーティションテーブルに実装されるものと同様のパーティションメンテナンスおよび修復機能が提供されます (パーティションテーブルでもサポートされます。詳細は、セクション13.7.3「テーブル保守ステートメント」 を参照してください)。 これには、ANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREBUILD PARTITION、および REPAIR PARTITION が含まれます。 これらの各オプションは、1 つ以上のパーティション名から成るカンマで区切られた partition_names 句を受け取ります。 パーティションはターゲットテーブルにすでに存在している必要があります。 partition_names のかわりに ALL キーワードを使用することもできます。この場合、ステートメントはすべてのテーブルパーティションで動作します。 詳細および例については、セクション24.3.4「パーティションの保守」を参照してください。

    InnoDB は現在、パーティションごとの最適化をサポートしていません。ALTER TABLE ... OPTIMIZE PARTITION では、テーブル全体が再構築および分析され、適切な警告が発行されます。 (Bug #11751825、Bug #42822) この問題を回避するには、かわりに ALTER TABLE ... REBUILD PARTITION および ALTER TABLE ... ANALYZE PARTITION を使用します。

    ANALYZE PARTITION, CHECK PARTITION, OPTIMIZE PARTITION および REPAIR PARTITION オプションは、パーティション化されていないテーブルではサポートされていません。

  • REMOVE PARTITIONING を使用すると、テーブルまたはそのデータに影響を与えることなく、テーブルのパーティション化を削除できます。 このオプションは、カラムやインデックスの追加、削除、名前変更などのために使用されるその他の ALTER TABLE オプションと組み合わせることができます。

  • ALTER TABLEENGINE オプションを使用すると、パーティション化に影響を与えることなく、テーブルで使用されるストレージエンジンが変更されます。 ターゲットストレージエンジンは、独自のパーティショニングハンドラを提供する必要があります。 ネイティブのパーティショニングハンドラを持つのは、InnoDB および NDB ストレージエンジンだけです。現在、NDB は MySQL 8.0 ではサポートされていません。

ALTER TABLE ステートメントには、ほかの変更指定に加えて、PARTITION BY または REMOVE PARTITIONING 句を含めることができますが、PARTITION BY または REMOVE PARTITIONING 句は、ほかのどの指定よりもあとの最後に指定する必要があります。

ADD PARTITIONDROP PARTITIONCOALESCE PARTITIONREORGANIZE PARTITIONANALYZE PARTITIONCHECK PARTITION、および REPAIR PARTITION オプションは、個々のパーティションに対して機能するため、1 つの ALTER TABLE 内でほかの変更指定と組み合わせることはできません。 詳細は、セクション13.1.9.1「ALTER TABLE パーティション操作」を参照してください。

特定の ALTER TABLE ステートメントでは、次のいずれか 1 つのオプションの単一インスタンスのみを使用できます。PARTITION BYADD PARTITIONDROP PARTITIONTRUNCATE PARTITIONEXCHANGE PARTITIONREORGANIZE PARTITION、または COALESCE PARTITIONANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREBUILD PARTITIONREMOVE PARTITIONING

たとえば、次の 2 つのステートメントは無効です。

ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2;

ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;

最初のケースでは、次のように、分析される両方のパーティションを一覧表示した 1 つの ANALYZE PARTITION オプションを含む 1 つのステートメントを使用して、テーブル t1 のパーティション p1p2 を同時に分析できます。

ALTER TABLE t1 ANALYZE PARTITION p1, p2;

2 番目のケースでは、同じテーブルの別のパーティションに対する ANALYZE 操作と CHECK 操作を同時に実行することはできません。 代わりに、次のように、2 つの個別のステートメントを発行する必要があります。

ALTER TABLE t1 ANALYZE PARTITION p1;
ALTER TABLE t1 CHECK PARTITION p2;

サブパーティションに対する REBUILD 操作は現在サポートされていません。 REBUILD キーワードはサブパーティションでは明示的に禁止されており、使用すると ALTER TABLE はエラーで失敗します。

チェックまたは修復するパーティションに重複キーエラーが含まれている場合、CHECK PARTITION および REPAIR PARTITION の操作は失敗します。

これらのステートメントの詳細は、セクション24.3.4「パーティションの保守」 を参照してください。


関連キーワード:  ステートメント, PARTITION, TABLE, テーブル, CREATE, DROP, 定義, ANALYZE, セクション, VALUES