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

PolarDB:DDL操作

最終更新日:Aug 12, 2024

このトピックでは、PolarDB for MySQLの一般的なDDL操作について説明します。 このトピックは、ユーザーがDDL操作の動作を理解し、潜在的なリスクを評価し、これらの操作がビジネス活動に与える影響を最小限に抑えるのに役立つことを目的としています。

概要

MySQLでは、DDL操作は、インデックス、主キー、列、テーブル、外部キー、および生成された列に対する一連の複雑な操作です。 DDL操作は、大量の時間とハードウェアリソースを消費するだけでなく、テーブルをロックする可能性もあります。 不適切な使用は、ビジネスに深刻な影響を与える可能性があります。

長年の開発を経て、PolarDB for MySQLのDDLモジュールはパフォーマンスとロックの安定性を大幅に改善しました。 このトピックでは、さまざまなバージョンのPolarDB for MySQLで一般的なDDL操作について、次の点で説明します。

  • オペレーションが同時DMLを許可するかどうか: テーブルをロックするDDLオペレーションは、同時DMLオペレーションを許可しません。 ただし、DDL操作でオンラインDDL機能がサポートされている場合は、メタデータの変更中にのみテーブルをロックします。これは、ほとんどの場合1秒未満であり、テーブルスキーマの変更時にテーブルに対する読み取りおよび書き込み操作が可能です。 これにより、運用環境でのテーブルの応答性と可用性が向上します。 対照的に、オンラインDDLをサポートしていないDDL操作は、実行プロセス全体を通してテーブルをロックし、同時書き込み操作を防止します。 このようなDDL操作の実行が長期間続くと、ビジネスに重大な影響が生じる可能性があります。

  • テーブルを再構築するかどうか: テーブルを再構築する操作には、新しいテーブルスキーマに基づいてプライマリキーとすべてのセカンダリインデックスを再作成する必要があるため、時間がかかります。

    説明

    PolarDB for MySQLは並列DDLをサポートしています。 したがって、gh-ostやpt-oscなどのサードパーティのツールを使用するよりも、クラスターエンジンでDDL操作を実行することでパフォーマンスを向上させることができます。

  • 操作がメタデータのみを変更するかどうか: DDL操作がメタデータのみを変更し、テーブル内のデータは変更しない場合、テーブルサイズに関係なく即座に実行されます。

  • 並列DDLがサポートされているかどうか: 大きなテーブルにインデックスを作成したり、テーブルを再構築したりするシナリオでは、複数のスレッドを使用してDDL実行を高速化し、DDL操作のパフォーマンスを最大15〜20倍向上させる並列DDLを使用できます。 詳細については、「パラレルDDL」をご参照ください。

DDLアルゴリズム

PolarDB for MySQLは、次のDDLアルゴリズムをサポートしています。

  • INSTANT: ALGORITHMをINSTANTに設定すると、DDL操作はデータディクショナリのメタデータのみを変更します。 データを変更または複製することも、テーブルを再作成することもありません。 したがって、テーブルサイズの影響を受けず、すぐに完了します。

  • INPLACE: ALGORITHMをINPLACEに設定すると、データのレプリケーションと再編成がクラスタエンジンによって実行され、DDL操作の実行がより効率的になります。 ほとんどのDDL操作では、同時の読み取りと書き込みが許可され、ビジネスへの影響を最小限に抑えます。 さらに、RENAME TABLEADD COMMENTなどの一部のDDL操作は、テーブルのメタデータのみを変更するため、即座に完了できます。

  • COPY: ALGORITHMをCOPYに設定すると、DDL操作はテーブルのすべてのデータを新しいテーブルに複製します。 データ複製中、元のテーブルのSNW (SHARED_NO_WRITE) ロックが保持されます。 したがって、DDL操作の実行中は読み取りのみがサポートされます。 同時書き込みは許可されていないため、ビジネスに大きな影響を与えます。

同時の読み取りと書き込みを許可するDDL操作は、オンラインDDLと呼ばれます。 オンラインDDLは、ビジネス活動に比較的小さな影響を与えます。 ほとんどの場合、DDLアルゴリズムを手動で指定する必要はありません。 PolarDBは、INSTANT、INPLACE、およびCOPYを順番に試すことで、最適なアルゴリズムを自動的に選択します。 ALTER TABLE文でALGORITHM句とLOCK句を使用して、DDL操作をきめ細かく管理できます。

  • ALGORITHM句: 指定されたアルゴリズムでDDL操作を実行します。 有効な値は、DEFAULT、INSTANT、INPLACE、およびCOPYです。 DDL操作が指定されたALGORITHM値をサポートしない場合、エラーが返されます。

  • LOCK句: DDL実行中のテーブルへの同時アクセスを制御します。 LOCK句を使用して、テーブルの変更時の同時読み取りと書き込みを制御できます。 有効な値は次のとおりです。

    • DEFAULT: 特定のDDL操作で許可されている数の同時読み取りと書き込みを許可します。

    • NONE: DDL実行中の同時読み取りと書き込みを許可します。 このようなレベルの同時アクセスがDDL操作によって許可されない場合、エラーが返されます。

    • 共有: 同時読み取りは許可しますが、書き込みはブロックします。 同時読み取りが許可されない場合、エラーが返されます。

    • EXCLUSIVE: DDL実行中のすべての同時読み取りと書き込みをブロックします。

ALTER tableの実行中にテーブルの可用性を確保するには、LOCK句を使用します。 DDL操作でLOCK句で指定されているレベルよりも制限されたレベルのロックが必要な場合、DDL操作は直ちに停止します。

DDL操作

インデックス操作

PolarDB for MySQL 8.0.2

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

セカンダリインデックスの作成

はい

いいえ

継続しない

継続する

セカンダリインデックスを削除する

はい

継続しない

継続する

非該当

セカンダリインデックスの名前変更

はい

継続しない

継続する

非該当

FULLTEXTインデックスの追加

いいえ

いいえ

説明

最初のフルテキストインデックスがテーブルに作成されている場合、ユーザー定義のFTS_DOC_ID列がないため、追加のテーブルが再構築されます。

いいえ

いいえ

SPATIALインデックスを追加する

いいえ

いいえ

いいえ

いいえ

PolarDB for MySQL 8.0.1

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

セカンダリインデックスの作成

はい

いいえ

継続しない

継続する

セカンダリインデックスを削除する

はい

継続しない

継続する

非該当

セカンダリインデックスの名前変更

はい

継続しない

継続する

非該当

FULLTEXTインデックスの追加

いいえ

いいえ

説明

最初のフルテキストインデックスがテーブルに作成されている場合、ユーザー定義のFTS_DOC_ID列がないため、追加のテーブルが再構築されます。

いいえ

いいえ

SPATIALインデックスを追加する

いいえ

いいえ

いいえ

いいえ

PolarDB for MySQLの5.7

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

セカンダリインデックスの作成

はい

いいえ

継続しない

継続する

セカンダリインデックスを削除する

はい

継続しない

継続する

非該当

セカンダリインデックスの名前変更

はい

継続しない

継続する

非該当

FULLTEXTインデックスの追加

いいえ

いいえ

説明

最初のフルテキストインデックスがテーブルに作成されている場合、ユーザー定義のFTS_DOC_ID列がないため、追加のテーブルが再構築されます。

いいえ

いいえ

SPATIALインデックスを追加する

いいえ

いいえ

いいえ

いいえ

PolarDB for MySQLの5.6

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

セカンダリインデックスの作成

はい

いいえ

いいえ

いいえ

セカンダリインデックスを削除する

はい

継続しない

継続する

非該当

セカンダリインデックスの名前変更

はい

継続しない

継続する

非該当

FULLTEXTインデックスの追加

いいえ

いいえ

説明

最初のフルテキストインデックスがテーブルに作成されている場合、ユーザー定義のFTS_DOC_ID列がないため、追加のテーブルが再構築されます。

いいえ

いいえ

SPATIALインデックスを追加する

いいえ

いいえ

いいえ

いいえ

主キー操作

PolarDB for MySQL 8.0.2

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

主キーの作成

はい

はい

継続しない

継続する

主キーを削除するDrop a primary key

継続しない

継続する

いいえ

いいえ

主キーをドロップして別のキーを追加する

はい

はい

継続しない

継続する

PolarDB for MySQL 8.0.1

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

主キーの作成

はい

はい

継続しない

継続する

主キーを削除するDrop a primary key

継続しない

継続する

いいえ

いいえ

主キーをドロップして別のキーを追加する

はい

はい

継続しない

継続する

PolarDB for MySQLの5.7

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

主キーの作成

はい

はい

継続しない

継続する

主キーを削除するDrop a primary key

継続しない

継続する

いいえ

いいえ

主キーをドロップして別のキーを追加する

はい

はい

継続しない

継続する

PolarDB for MySQLの5.6

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

主キーの作成

はい

はい

いいえ

いいえ

主キーを削除するDrop a primary key

継続しない

継続する

いいえ

いいえ

主キーをドロップして別のキーを追加する

はい

はい

いいえ

いいえ

列操作

PolarDB for MySQL 8.0.2

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

列の追加

はい

1なし

はい1

はい1

列を削除する

はい

はい

継続しない

継続する

列の名前変更

はい

継続しない

継続する

非該当

列の並べ替え

はい

はい

継続しない

継続する

列のデフォルト値を指定する

はい

継続しない

継続する

非該当

列コメントの変更

はい

継続しない

継続する

非該当

列データ型の変更

継続しない

継続する

いいえ

いいえ

VARCHAR列の長さを拡張する

はい2

継続しない

継続する

非該当

文字セットをUTF8mb3からUTF8mb4に変更する

いいえ

3なし

はい3

いいえ

列のデフォルト値を削除する

はい

継続しない

継続する

非該当

自動インクリメント値の変更

はい

継続しない

継続する

非該当

列をNULLにする

はい

はい

継続しない

継続する

列をNULLではないようにする

はい

はい

継続しない

継続する

ENUMまたはSET列の定義を変更する

はい

いいえ

はい4

非該当

  1. インスタントADD COLUMN機能を使用すると、テーブルの最後にのみ列を追加できます。 テーブルにプライマリキーが指定されていない場合は、必ずimplicit_primery_keyパラメーターをOFFに設定してください。 これにより、テーブルの末尾に暗黙の主キー列があるため、列の追加に失敗するのを防ぎます。 インスタントADD COLUMN機能は、圧縮テーブル (ROW_FORMAT=compressed) 、フルテキストインデックスを持つテーブル、または一時テーブルではサポートされません。 クラスターがインスタントADD COLUMN機能をサポートしていない場合、システムはINPLACEアルゴリズムを使用して列を追加します。 これにより、テーブルの再構築がトリガーされます。 テーブルの再構築プロセス中、同時の読み取りおよび書き込み操作が許可されます。 並列DDL機能を使用して、列の追加を高速化できます。

    インメモリ列インデックス (IMCI) を含むテーブルに列を追加すると、IMCIが再構築されます。 したがって、IMCIを含むテーブルでは、インスタントADD列機能はサポートされません。 この問題を解決するには、loose_imci_enable_add_column_instant_ddlパラメーターをONに設定して、インスタントADD COLUMN機能を有効にします。 このようにして、IMCIはPolarDBによってバックグラウンドで非同期的に再構築され、一時的に利用できなくなります。 詳細については、「DDLステートメントを実行してIMCIを動的に作成および削除する」をご参照ください。

  2. VARCHAR列の長さを即座に増やすには、VARCHAR列の値を格納するために使用されるバイト数が同じであることを確認します。 サイズが0〜255バイトの範囲内のVARCHAR列には、1バイトのストレージが必要です。 サイズが256バイト以上のVARCHAR列には、2バイトのストレージが必要です。 VARCHAR列の長さを同じ範囲 (0〜255バイトまたは256バイト以上) 内で制御した場合のみ、ストレージ要件は変わりません。 これらのシナリオでは、ALTER TABLEステートメントの実行時にメタデータのみが更新されます。 長さが255バイトのしきい値を超えると、PolarDBは自動的にCOPYアルゴリズムを使用します。 このプロセスには、読み取りのみが許可されるテーブルロックが含まれます。

    変更されたVARCHAR列の長さが同じバイトサイズの範囲内にあるかどうかわからない場合は、DDL操作にALGORITHM=INPLACE句を使用します。 インスタント列拡張がサポートされていない場合、エラーが返されます。 例:

    ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);
    
    ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

    VARCHAR値によって消費されるスペースは、実際の長さによって異なります。 そのため、VARCHAR列の最大長を256バイト以上に設定して、列長拡張のテーブルコピー (ALGORITHM=copy) を回避することを推奨します。

  3. 次の条件を満たす場合、列の文字セットがUTF8mb3からUTF8mb4に変更され、メタデータのみが変更されます。 条件が満たされない場合、COPYアルゴリズムが使用される。 これにより、テーブルのロックと再構築が行われ、その間は読み取り操作のみが許可されます。

    • 列タイプは、CHAR、VARCHAR、ENUM、またはTEXTです。

    • 変更する列にインデックスが存在しません。

    • 列の最大長は、255バイトまで、または255バイト以上のいずれかで一貫しています。

    ALGORITHM=INPLACEを指定すると、テーブルの再構築を必要とせずにDDLを強制的に実行できます。 DDL操作がCOPYアルゴリズムを使用してのみ実行できる場合、エラーが返されます。 例:

    ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = inplace;
    ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
  4. ENUM列またはSET列の定義を変更すると、データ型のストレージサイズが変更されず、リストの最後にメンバーが追加されるという条件が満たされた場合にのみ、メタデータが変更されます。 それ以外の場合は、テーブルコピーが必要です。

PolarDB for MySQL 8.0.1

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

列の追加

はい

1なし

はい1

はい1

列を削除する

はい

はい

継続しない

継続する

列の名前変更

はい

継続しない

継続する

非該当

列の並べ替え

はい

はい

継続しない

継続する

列のデフォルト値を指定する

はい

継続しない

継続する

非該当

列コメントの変更

はい

継続しない

継続する

非該当

列データ型の変更

継続しない

継続する

いいえ

いいえ

VARCHAR列の長さを拡張する

はい2

継続しない

継続する

非該当

文字セットをUTF8mb3からUTF8mb4に変更する

いいえ

3なし

はい3

いいえ

列のデフォルト値を削除する

はい

継続しない

継続する

非該当

自動インクリメント値の変更

はい

継続しない

継続する

非該当

列をNULLにする

はい

はい

継続しない

継続する

列をNULLではないようにする

はい

はい

継続しない

継続する

ENUMまたはSET列の定義を変更する

はい

いいえ

はい4

非該当

  1. インスタントADD COLUMN機能を使用すると、テーブルの最後に列を追加できます。 テーブルにプライマリキーが指定されていない場合は、必ずimplicit_primery_keyパラメーターをOFFに設定してください。 これにより、テーブルの末尾に暗黙の主キー列があるため、列の追加に失敗するのを防ぎます。 インスタントADD COLUMN機能は、圧縮テーブル (ROW_FORMAT=compressed) 、フルテキストインデックスを持つテーブル、または一時テーブルではサポートされません。 クラスターがインスタントADD COLUMN機能をサポートしていない場合、システムはINPLACEアルゴリズムを使用して列を追加します。 これにより、テーブルの再構築がトリガーされます。 テーブルの再構築プロセス中、同時の読み取りおよび書き込み操作が許可されます。 並列DDL機能を使用して、列の追加を高速化できます。

    インメモリ列インデックス (IMCI) を含むテーブルに列を追加すると、IMCIが再構築されます。 したがって、IMCIを含むテーブルでは、インスタントADD列機能はサポートされません。 解決策は、loose_imci_enable_add_column_instant_ddlONに設定することで、インスタントCOLUMN機能を有効にすることです。 このようにして、IMCIはPolarDBによってバックグラウンドで非同期的に再構築され、一時的に利用できなくなります。 詳細については、「DDLステートメントを実行してIMCIを動的に作成および削除する」をご参照ください。

  2. VARCHAR列の長さを即座に増やすには、VARCHAR列の値を格納するために使用されるバイト数が同じであることを確認します。 サイズが0〜255バイトの範囲内のVARCHAR列には、1バイトのストレージが必要です。 サイズが256バイト以上のVARCHAR列には、2バイトのストレージが必要です。 VARCHAR列の長さを同じ範囲 (0〜255バイトまたは256バイト以上) 内で制御した場合のみ、ストレージ要件は変わりません。 これらのシナリオでは、ALTER TABLEステートメントの実行時にメタデータのみが更新されます。 長さが255バイトのしきい値を超えると、PolarDBは自動的にCOPYアルゴリズムを使用します。 このプロセスにはテーブルロックが含まれ、その間は読み取り操作のみが許可されます。

    変更されたVARCHAR列の長さが同じバイトサイズの範囲内にあるかどうかわからない場合は、DDL操作にALGORITHM=INPLACE句を使用します。 インスタント列拡張がサポートされていない場合、エラーが返されます。 例:

    ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);
    
    エラー0A000: ALGORITHM=INPLACEはサポートされていません。 理由: 列タイプINPLACEを変更できません。 ALGORITHM=COPYを試してください。

    VARCHAR値によって消費されるスペースは、実際の長さによって異なります。 そのため、VARCHAR列の最大長を256バイト以上に設定して、列長拡張のテーブルコピー (ALGORITHM=copy) を回避することを推奨します。

  3. loose_innodb_support_instant_modify_charsetONに設定されていて、次の条件が満たされている場合、メタデータのみを変更して、列の文字セットをUTF8mb3からUTF8mb4に変更できます。 条件が満たされない場合、COPYアルゴリズムが使用される。 これにより、テーブルのロックと再構築が行われ、その間は読み取り操作のみが許可されます。

    • 列タイプは、CHAR、VARCHAR、ENUM、またはTEXTです。

    • 変更する列にインデックスが存在しません。

    • 列の最大長は、255バイトまで、または255バイト以上のいずれかで一貫しています。

    ALGORITHM=INPLACEを指定すると、テーブルの再構築を必要とせずにDDLを強制的に実行できます。 DDL操作がCOPYアルゴリズムを使用してのみ実行できる場合、エラーが返されます。 例:

    ALTER TABLEテストは列b charを変更します (1) CHARACTER SET utf8mb4デフォルトnull、algorithm = inplace;
    エラー1846 (0A000): ALGORITHM=INPLACEはサポートされていません。 理由: 列タイプINPLACEを変更できません。 ALGORITHM=COPYを試してください。
  4. ENUM列またはSET列の定義を変更すると、データ型のストレージサイズが変更されず、リストの最後にメンバーが追加された場合にのみ、メタデータが変更されます。 それ以外の場合は、テーブルコピーが必要です。

PolarDB for MySQLの5.7

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

列の追加

はい

1なし

はい1

はい1

列を削除する

はい

はい

継続しない

継続する

列の名前変更

はい

継続しない

継続する

非該当

列の並べ替え

はい

はい

継続しない

継続する

列のデフォルト値を指定する

はい

継続しない

継続する

非該当

列コメントの変更

はい

継続しない

継続する

非該当

列データ型の変更

継続しない

継続する

いいえ

いいえ

VARCHAR列の長さを拡張する

はい2

継続しない

継続する

非該当

文字セットをUTF8mb3からUTF8mb4に変更する

継続しない

継続する

いいえ

いいえ

列のデフォルト値を削除する

はい

継続しない

継続する

非該当

自動インクリメント値の変更

はい

継続しない

継続する

非該当

列をNULLにする

はい

はい

継続しない

継続する

列をNULLではないようにする

はい

はい

継続しない

継続する

ENUMまたはSET列の定義を変更する

はい

いいえ

はい3

非該当

  1. インスタントADD COLUMN機能を有効にするには、loose_innodb_support_instant_add_columnONに設定します。 この機能を使用すると、テーブルの最後にのみ列を追加できます。 テーブルにプライマリキーが指定されていない場合は、必ずimplicit_primery_keyパラメーターをOFFに設定してください。 これにより、テーブルの末尾に暗黙の主キー列があるため、列の追加に失敗するのを防ぎます。 インスタントADD COLUMN機能は、圧縮テーブル (ROW_FORMAT=compressed) 、フルテキストインデックスを持つテーブル、または一時テーブルではサポートされません。 クラスターがインスタントADD COLUMN機能をサポートしていない場合、システムはINPLACEアルゴリズムを使用して列を追加します。 これにより、テーブルの再構築がトリガーされます。 テーブルの再構築プロセス中、同時の読み取りおよび書き込み操作が許可されます。 並列DDL機能を使用して、列の追加を高速化できます。

  2. VARCHAR列の長さを即座に増やすには、VARCHAR列の値を格納するために使用されるバイト数が同じであることを確認します。 サイズが0〜255バイトの範囲内のVARCHAR列には、1バイトのストレージが必要です。 サイズが256バイト以上のVARCHAR列には、2バイトのストレージが必要です。 VARCHAR列の長さを同じ範囲 (0〜255バイトまたは256バイト以上) 内で制御した場合のみ、ストレージ要件は変わりません。 これらのシナリオでは、ALTER TABLEステートメントの実行時にメタデータのみが更新されます。 長さが255バイトのしきい値を超えると、PolarDBは自動的にCOPYアルゴリズムを使用します。 このプロセスにはテーブルロックが含まれ、その間は読み取り操作のみが許可されます。

    変更されたVARCHAR列の長さが同じバイトサイズの範囲内にあるかどうかわからない場合は、DDL操作にALGORITHM=INPLACE句を使用します。 インスタント列拡張がサポートされていない場合、エラーが返されます。 例:

    ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);
    
    エラー0A000: ALGORITHM=INPLACEはサポートされていません。 理由: 列タイプINPLACEを変更できません。 ALGORITHM=COPYを試してください。

    VARCHAR値によって消費されるスペースは、実際の長さによって異なります。 そのため、VARCHAR列の最大長を256バイト以上に設定して、列長拡張のテーブルコピー (ALGORITHM=copy) を回避することを推奨します。

  3. ENUM列またはSET列の定義を変更すると、データ型のストレージサイズが変更されず、リストの最後にメンバーが追加された場合にのみ、メタデータが変更されます。 それ以外の場合は、テーブルコピーが必要です。

PolarDB for MySQLの5.6

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

列の追加

はい

1なし

はい1

いいえ

列を削除する

はい

はい

いいえ

いいえ

列の名前変更

はい

継続しない

継続する

非該当

列の並べ替え

はい

はい

いいえ

いいえ

列のデフォルト値を指定する

はい

継続しない

継続する

非該当

列コメントの変更

はい

継続しない

継続する

非該当

列データ型の変更

継続しない

継続する

いいえ

いいえ

VARCHAR列の長さを拡張する

継続しない

継続する

いいえ

いいえ

文字セットをUTF8mb3からUTF8mb4に変更する

継続しない

継続する

いいえ

いいえ

列のデフォルト値を削除する

はい

継続しない

継続する

非該当

自動インクリメント値の変更

はい

継続しない

継続する

非該当

列をNULLにする

はい

はい

いいえ

いいえ

列をNULLではないようにする

はい

はい

いいえ

いいえ

ENUMまたはSET列の定義を変更する

はい

いいえ

はい2

非該当

  1. インスタントADD COLUMN機能を有効にするには、loose_innodb_support_instant_add_列パラメーターをONに設定します。 この機能を使用すると、テーブルの最後にのみ列を追加できます。 テーブルにプライマリキーが指定されていない場合は、必ずimplicit_primery_keyパラメーターをOFFに設定してください。 これにより、テーブルの末尾に暗黙の主キー列があるため、列の追加に失敗するのを防ぎます。 インスタントADD COLUMN機能は、圧縮テーブル (ROW_FORMAT=compressed) 、フルテキストインデックスを持つテーブル、一時テーブル、またはパーティションテーブルではサポートされません。 クラスターがインスタントADD COLUMN機能をサポートしていない場合、システムはINPLACEアルゴリズムを使用して列を追加します。 これにより、テーブルの再構築がトリガーされます。 テーブルの再構築プロセス中、同時の読み取りおよび書き込み操作が許可されます。

    説明

    PolarDB For MySQL 5.6の場合、インスタントADD COLUMN機能はカナリアリリースにあります。 この機能を使用するには、クォータセンターに移動し、クォータID polardb_mysql_iac_56に対応するクォータ名を見つけ、[適用] をクリックします。

  2. ENUM列またはSET列の定義を変更すると、データ型のストレージサイズが変更されず、リストの最後にメンバーが追加された場合にのみ、メタデータが変更されます。 それ以外の場合は、テーブルコピーが必要です。

テーブル操作

PolarDB for MySQL 8.0.2

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

ROW_FORMAT属性の変更

はい

はい

継続しない

継続する

KEY_BLOCK_SIZE属性の変更

はい

はい

継続しない

継続する

永続統計の設定

はい

継続しない

継続する

非該当

文字セットの指定

はい

継続しない

継続する

非該当

文字セットの変更

継続しない

継続する

いいえ

いいえ

テーブルの最適化

はい

はい

説明

ALTER table table_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONEステートメントを使用して、フルテキストインデックスを含むテーブルに対してインプレース最適化操作を実行することはできません。

継続しない

継続する

テーブルの再構築

はい

はい

継続しない

継続する

テーブル名の変更

はい

継続しない

継続する

非該当

テーブルコメントの変更

はい

継続しない

継続する

非該当

PolarDB for MySQL 8.0.1

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

ROW_FORMAT属性の変更

はい

はい

継続しない

継続する

KEY_BLOCK_SIZE属性の変更

はい

はい

継続しない

継続する

永続統計の設定

はい

継続しない

継続する

非該当

文字セットの指定

はい

継続しない

継続する

非該当

文字セットの変更

継続しない

継続する

いいえ

いいえ

テーブルの最適化

はい

はい

説明

ALTER table table_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONEステートメントを使用して、フルテキストインデックスを含むテーブルに対してインプレース最適化操作を実行することはできません。

継続しない

継続する

テーブルの再構築

はい

はい

継続しない

継続する

テーブル名の変更

はい

継続しない

継続する

非該当

テーブルコメントの変更

はい

継続しない

継続する

非該当

PolarDB for MySQLの5.7

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

ROW_FORMAT属性の変更

はい

はい

継続しない

継続する

KEY_BLOCK_SIZE属性の変更

はい

はい

継続しない

継続する

永続統計の設定

はい

継続しない

継続する

非該当

文字セットの指定

はい

継続しない

継続する

非該当

文字セットの変更

継続しない

継続する

いいえ

いいえ

テーブルの最適化

はい

はい

説明

ALTER table table_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONEステートメントを使用して、フルテキストインデックスを含むテーブルに対してインプレース最適化操作を実行することはできません。

継続しない

継続する

テーブルの再構築

はい

はい

継続しない

継続する

テーブル名の変更

はい

継続しない

継続する

非該当

テーブルコメントの変更

はい

継続しない

継続する

非該当

PolarDB for MySQLの5.6

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

ROW_FORMAT属性の変更

はい

はい

いいえ

いいえ

KEY_BLOCK_SIZE属性の変更

はい

はい

いいえ

いいえ

永続統計の設定

はい

継続しない

継続する

非該当

文字セットの指定

はい

継続しない

継続する

非該当

文字セットの変更

継続しない

継続する

いいえ

いいえ

テーブルの最適化

はい

はい

説明

ALTER table table_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONEステートメントを使用して、フルテキストインデックスを含むテーブルに対してインプレース最適化操作を実行することはできません。

いいえ

いいえ

テーブルを再作成する

はい

はい

いいえ

いいえ

テーブル名の変更

はい

継続しない

継続する

非該当

テーブルコメントの変更

はい

継続しない

継続する

非該当

生成された列操作

PolarDB for MySQL 8.0.2

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

STORED列の追加

いいえ

説明

操作にはSQL/Serverレイヤーが含まれるため、Online DDLを介したSTORED列の追加はサポートされません。

はい

いいえ

いいえ

STORED列の順序を変更する

継続しない

継続する

いいえ

いいえ

STORED列を削除する

はい

はい

継続しない

継続する

VIRTUAL列の追加

はい

継続しない

継続する

非該当

VIRTUAL列の順序を変更する

継続しない

継続する

いいえ

いいえ

仮想列を削除する

はい

継続しない

継続する

非該当

PolarDB for MySQL 8.0.1

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

STORED列の追加

いいえ

説明

操作にはSQL/Serverレイヤーが含まれるため、Online DDLを介したSTORED列の追加はサポートされません。

はい

いいえ

いいえ

STORED列の順序を変更する

継続しない

継続する

いいえ

いいえ

STORED列を削除する

はい

はい

継続しない

継続する

VIRTUAL列の追加

はい

継続しない

継続する

非該当

VIRTUAL列の順序を変更する

継続しない

継続する

いいえ

いいえ

仮想列を削除する

はい

継続しない

継続する

非該当

PolarDB for MySQLの5.7

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

STORED列の追加

いいえ

説明

操作にはSQL/Serverレイヤーが含まれるため、Online DDLを介したSTORED列の追加はサポートされません。

はい

いいえ

いいえ

STORED列の順序を変更する

継続しない

継続する

いいえ

いいえ

STORED列を削除する

はい

はい

継続しない

継続する

VIRTUAL列の追加

はい

継続しない

継続する

非該当

VIRTUAL列の順序を変更する

継続しない

継続する

いいえ

いいえ

仮想列を削除する

はい

継続しない

継続する

非該当

PolarDB for MySQLの5.6

PolarDB for MySQL 5.6は、生成された列操作をサポートしていません。

外部キー操作

PolarDB for MySQL 8.0.2

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

外部キーを追加する

はい1

1なし

はい1

非該当

外部キーを削除するDrop a foreign key

はい1

1なし

はい1

非該当

PolarDB for MySQL 8.0.1

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

外部キーを追加する

はい1

1なし

はい1

非該当

外部キーを削除するDrop a foreign key

はい1

1なし

はい1

非該当

PolarDB for MySQLの5.7

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

外部キーを追加する

はい1

1なし

はい1

非該当

外部キーを削除するDrop a foreign key

はい1

1なし

はい1

非該当

PolarDB for MySQLの5.6

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

外部キーを追加する

はい1

1なし

はい1

非該当

外部キーを削除するDrop a foreign key

はい1

1なし

はい1

非該当

1. foreign_key_checksオプションが無効になっており、メタデータのみが変更されている場合、インプレース外部キー操作がサポートされます。 これらの条件が満たされない場合、インプレース外部キー操作にはテーブルコピーとロックが必要です。

パーティション化操作

PolarDB for MySQL 8.0.2

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

パーティションを追加する

はい1

2なし

はい

いいえ

パーティションを削除するDrop a partition

はい1

2なし

いいえ

いいえ

パーティション分割されたテーブルのスペースを破棄する

いいえ

いいえ

いいえ

いいえ

パーティションテーブルのスペースをインポートする

いいえ

いいえ

いいえ

いいえ

パーティションを切り捨てる

はい

いいえ

いいえ

いいえ

Coalesceパーティション

いいえ

はい3

いいえ

いいえ

パーティションの再編成

はい1

7なし

いいえ

いいえ

Exchangeパーティション

はい1

継続しない

継続する

いいえ

パーティションの分析

はい

いいえ

8なし

いいえ

パーティションの確認

はい

いいえ

9なし

いいえ

パーティションの最適化

はい4

はい4

いいえ

はい4

パーティションの再構築

はい1

7なし

いいえ

いいえ

パーティションを修復する

はい

10なし

いいえ

いいえ

通常のテーブルを分割する

継続しない

継続する

はい5

いいえ

パーティション分割を削除

継続しない

継続する

いいえ

いいえ

部分インデックスの作成

はい

6なし

継続しない

継続する

  1. パーティションのメタデータロック (MDL) を有効にするためにloose_partition_level_mdl_enabledパラメーターをtrueに設定した後、DDL操作は無関係なパーティションのDML操作に影響を与えません。 詳細については、「オンラインパーティションのメンテナンス」をご参照ください。

  2. ADD PARTITIONまたはDROP PARTITIONをRANGEまたはLISTパーティションで使用しても、テーブルを再構築する必要はありません。 ADD PARTITIONまたはDROP PARTITIONをHASHまたはKEYパーティションで使用するには、テーブルの再構築が必要です。 DROP PARTITIONは、HASHまたはKEYパーティションでは使用できません。

  3. COALESCE PARTITIONは、HASHおよびKEYパーティションでのみ使用できます。

  4. InnoDBテーブルでOPTIMIZE PARTITIONを実行すると、パーティションテーブル全体の再構築がトリガーされます。 テーブルの再構築中は、読み取りおよび書き込み操作が許可されます。 パラレルDDLを使用してテーブルの再構築を高速化するには、innodb_parallel_build_primary_indexパラメーターをONに設定します。 詳細については、「パラレルDDL」をご参照ください。

  5. 通常のテーブルは、レンジパーティションテーブルにのみ即座に変換できます。 詳細については、「共通テーブルを範囲パーティションテーブルに切り替える」をご参照ください。

  6. PolarDB for MySQLを使用すると、特定のパーティションのインデックスを作成および削除できます。 詳細は、「部分インデックス」をご参照ください。

  7. REORGANIZE PARTITIONおよびREBUILD PARTITIONは、指定されたパーティションのみに影響します。

  8. ANALYZE PARTITIONは、テーブルのメタデータとデータではなく、統計のみを変更します。

  9. CHECK PARTITIONは、テーブルのメタデータとデータを変更しません。

  10. REPAIR PARTITIONは指定されたパーティションのみを再構築します。

PolarDB for MySQL 8.0.1

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

パーティションを追加する

いいえ

1なし

はい

いいえ

パーティションを削除するDrop a partition

いいえ

2なし

いいえ

いいえ

パーティション分割されたテーブルのスペースを破棄する

いいえ

いいえ

いいえ

いいえ

パーティションテーブルのスペースをインポートする

いいえ

いいえ

いいえ

いいえ

パーティションを切り捨てる

はい

いいえ

いいえ

いいえ

Coalesceパーティション

継続しない

継続する

いいえ

いいえ

パーティションの再編成

いいえ

4なし

いいえ

いいえ

Exchangeパーティション

はい

はい

はい

いいえ

パーティションの分析

はい

はい

5なし

いいえ

パーティションの確認

はい

はい

6なし

いいえ

パーティションの最適化

はい3

はい3

いいえ

はい3

パーティションの再構築

いいえ

4なし

いいえ

いいえ

パーティションを修復する

はい

4なし

いいえ

いいえ

通常のテーブルを分割する

継続しない

継続する

いいえ

いいえ

パーティション分割を削除

継続しない

継続する

いいえ

いいえ

  1. ADD PARTITIONまたはDROP PARTITIONをRANGEまたはLISTパーティションで使用しても、テーブルを再構築する必要はありません。 HASHおよびKEYパーティションでADD PARTITIONを使用するには、テーブルの再構築が必要です。

  2. DROP PARTITIONは、HASHまたはKEYパーティションでは使用できません。

  3. InnoDBテーブルでOPTIMIZE PARTITIONを実行すると、パーティションテーブル全体の再構築がトリガーされます。 テーブルの再構築中は、読み取りおよび書き込み操作が許可されます。 パラレルDDLを使用してテーブルの再構築を高速化するには、innodb_parallel_build_primary_indexパラメーターをONに設定します。 詳細については、「パラレルDDL」をご参照ください。

  4. REORGANIZE PARTITION、REBUILD PARTITION、およびREPAIR PARTITIONは、指定されたパーティションのみに影響します。

  5. ANALYZE PARTITIONは、テーブルのメタデータとデータではなく、統計のみを変更します。

  6. CHECK PARTITIONは、テーブルのメタデータとデータを変更しません。

PolarDB for MySQLの5.7

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

パーティションを追加する

いいえ

1なし

はい

いいえ

パーティションを削除するDrop a partition

いいえ

1なし

いいえ

いいえ

パーティション分割されたテーブルのスペースを破棄する

いいえ

いいえ

いいえ

いいえ

パーティションテーブルのスペースをインポートする

いいえ

いいえ

いいえ

いいえ

パーティションを切り捨てる

はい

いいえ

いいえ

いいえ

Coalesceパーティション

継続しない

継続する

いいえ

いいえ

パーティションの再編成

いいえ

2なし

いいえ

いいえ

Exchangeパーティション

はい

継続しない

継続する

いいえ

パーティションの分析

はい

いいえ

3なし

いいえ

パーティションの確認

はい

いいえ

4なし

いいえ

パーティションの最適化

継続しない

継続する

いいえ

いいえ

パーティションの再構築

いいえ

2なし

いいえ

いいえ

パーティションを修復する

はい

2なし

いいえ

いいえ

通常のテーブルを分割する

継続しない

継続する

いいえ

いいえ

パーティション分割を削除

継続しない

継続する

いいえ

いいえ

  1. ADD PARTITIONまたはDROP PARTITIONをRANGEまたはLISTパーティションで使用しても、テーブルを再構築する必要はありません。 ADD PARTITIONまたはDROP PARTITIONをHASHまたはKEYパーティションで使用するには、テーブルの再構築が必要です。 DROP PARTITIONは、HASHまたはKEYパーティションでは使用できません。

  2. REORGANIZE PARTITION、REBUILD PARTITION、およびREPAIR PARTITIONは、指定されたパーティションのみに影響します。

  3. ANALYZE PARTITIONは、テーブルのメタデータとデータではなく、統計のみを変更します。

  4. CHECK PARTITIONは、テーブルのメタデータとデータを変更しません。

PolarDB for MySQLの5.6

操作

同時DMLを許可

再構築テーブル

メタデータのみを変更

パラレルDDLをサポート

パーティションを追加する

いいえ

1なし

はい

いいえ

パーティションを削除するDrop a partition

いいえ

1なし

いいえ

いいえ

パーティション分割されたテーブルのスペースを破棄する

いいえ

いいえ

いいえ

いいえ

パーティションテーブルのスペースをインポートする

いいえ

いいえ

いいえ

いいえ

パーティションを切り捨てる

はい

いいえ

いいえ

いいえ

Coalesceパーティション

継続しない

継続する

いいえ

いいえ

パーティションの再編成

いいえ

2なし

いいえ

いいえ

Exchangeパーティション

はい

継続しない

継続する

いいえ

パーティションの分析

はい

いいえ

3なし

いいえ

パーティションの確認

はい

いいえ

4なし

いいえ

パーティションの最適化

継続しない

継続する

いいえ

いいえ

パーティションの再構築

いいえ

2なし

いいえ

いいえ

パーティションを修復する

はい

2なし

いいえ

いいえ

通常のテーブルを分割する

継続しない

継続する

いいえ

いいえ

パーティション分割を削除

継続しない

継続する

いいえ

いいえ

  1. ADD PARTITIONまたはDROP PARTITIONをRANGEまたはLISTパーティションで使用しても、テーブルを再構築する必要はありません。 ADD PARTITIONまたはDROP PARTITIONをHASHまたはKEYパーティションで使用するには、テーブルの再構築が必要です。 DROP PARTITIONは、HASHまたはKEYパーティションでは使用できません。

  2. REORGANIZE PARTITION、REBUILD PARTITION、およびREPAIR PARTITIONは、指定されたパーティションのみに影響します。

  3. ANALYZE PARTITIONは、テーブルのメタデータとデータではなく、統計のみを変更します。

  4. CHECK PARTITIONは、テーブルのメタデータとデータを変更しません。

DDL実行メソッド

  • PolarDB for MySQLINPLACEまたはINSTANTアルゴリズムを使用する場合、オンラインDDLを使用することを推奨します。 この方法は、より速い実行速度およびより高い安定性を提供する。

  • ただし、PolarDB for MySQLCOPYアルゴリズムを使用する場合、DDLを実行するにはテーブルロックが必要であり、読み取りまたは書き込み操作はできません。 この場合、DDLの実行中に読み取りおよび書き込み操作を許可するデータ管理サービス (DMS) またはgh-ostなどのサードパーティのツールを使用することをお勧めします。 ただし、これらのツールは効率が悪く、大きなテーブルや並行性の高いシナリオで膨大なデータの増分を処理する場合に失敗する傾向があります。

次の表は、2つのDDL実行方法を比較しています。

実行方法

同時読み取りと書き込みを許可

実行速度

バイナリロギングが必要

平行加速をサポート

オンライン DDL

はい

速い

継続しない

継続する

DMSまたはgh-ostなどのサードパーティ製ツール

はい

はい

いいえ

説明

サードパーティのツールを使用してDDL操作を実行すると、テーブルの切り替えやメタデータの変更中にMDL-Xロックが取得されます。 これにより、テーブルが一時的にロックされます。 テーブルのロックを防ぐ方法については、「Nonblocking DDLステートメント」および「プリエンプティブルDDL」をご参照ください。