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

PolarDB:インスタント ADD COLUMN

最終更新日:Apr 08, 2025

従来の方法でテーブルにカラムを追加する場合、テーブル全体が再構築され、大量のシステムリソースが消費されます。この問題に対処するために、PolarDB for MySQL は、テーブルサイズに関係なくテーブルにカラムを即座に追加できるインスタント ADD COLUMN 機能を提供します。

インスタント ADD COLUMN 機能は、INSTANT アルゴリズム を活用して DDL 操作を実行します。データディクショナリ内のメタデータのみを変更します。既存のデータの変更やコピー、テーブル全体の再構築は行いません。したがって、DDL 操作はテーブルサイズに関係なく数秒で完了します。

前提条件

クラスターで、次のいずれかのデータベースエンジンバージョンが実行されている必要があります。

  • PolarDB for MySQL 5.6 (リビジョンバージョン 5.6.1.0.43 以降)。

    説明

    インスタント ADD COLUMN 機能は、PolarDB for MySQL 5.6 ではカナリーリリースされています。PolarDB for MySQL 5.6 でこの機能を使用するには、クォータセンター にアクセスし、ID が polardb_mysql_iac_56 のクォータを見つけて、[適用] をクリックします。

  • PolarDB for MySQL 5.7 (リビジョンバージョン 5.7.1.0.6 以降)。

    説明

    PolarDB for MySQL 5.7 クラスターでインスタント ADD COLUMN 機能を使用するには、loose_innodb_support_instant_add_column パラメーターを ON に設定する必要があります。

  • PolarDB for MySQL 8.0。

    説明

    デフォルトでは、PolarDB for MySQL 8.0 クラスターはインスタント ADD COLUMN 機能をサポートしています。この機能を有効にするためにパラメーターを設定する必要はありません。

クラスターのデータベースエンジンバージョンのクエリ方法については、「エンジンバージョン」トピックの「エンジンバージョンのクエリ」セクションをご参照ください。

制限事項

  • インスタント ADD COLUMN 機能を使用して、テーブルの末尾にのみカラムを追加できます。

  • インスタント ADD COLUMN 機能を使用して、PolarDB for MySQL 8.0 クラスターのテーブルにのみ仮想カラムを追加できます。PolarDB for MySQL 5.6 または 5.7 クラスターでは使用できません。

  • PolarDB for MySQL 5.7 および 8.0 クラスターのパーティションテーブルにカラムを追加するために、インスタント ADD COLUMN 機能を使用できますが、PolarDB for MySQL 5.6 クラスターでは使用できません。

    説明

    パーティションテーブルにカラムを即座に追加できる機能は、PolarDB for MySQL 5.7 ではカナリーリリースされています。PolarDB for MySQL 5.7 でこの機能を使用するには、クォータセンター にアクセスし、ID が polarM_57_iac_on_partition_table のクォータを見つけて、[適用] をクリックします。

  • フルテキストインデックスが作成されているテーブルにカラムを追加するために、インスタント ADD COLUMN 機能を使用することはできません。

  • インメモリ カラム インデックス (IMCI) が作成されているテーブルにカラムを追加するために、インスタント ADD COLUMN 機能を使用できます。クラスターは、次の要件を満たしている必要があります。

    • バージョンが 8.0.1.1.42 より前、または 8.0.2.2.23 より前の PolarDB for MySQL クラスターの場合、imci_enable_add_column_instant_ddlON に設定する必要があります。インスタント ADD COLUMN 機能を使用すると、テーブルの IMCI がバックグラウンドで再構築されます。再構築プロセス中は、IMCI は使用できません。

    • バージョンが 8.0.1.1.42 以降、または 8.0.2.2.23 以降の PolarDB for MySQL クラスターの場合、imci_enable_add_column_instant_ddlOFF に設定する必要があります。

  • implicit_primary_key オプションが有効になっているが、カスタム プライマリキー列がないテーブルにカラムを追加するために、インスタント ADD COLUMN 機能を使用することはできません。

  • インスタント ADD COLUMN 操作と他の DDL 操作 (インデックスの作成など) を同じ SQL 文に含めることはできません。

使用方法

パラメーターの設定

  • PolarDB for MySQL 5.6 および 5.7 クラスターの場合、loose_innodb_support_instant_add_column パラメーターを ON に設定する必要があります。クラスターのパラメーターを設定する方法については、「クラスターとノードパラメーターの設定」をご参照ください。

    パラメーター

    レベル

    説明

    loose_innodb_support_instant_add_column

    グローバル

    インスタント ADD COLUMN 機能を有効にするかどうかを指定します。有効な値:

    • ON

    • OFF

  • PolarDB for MySQL 8.0 クラスターの場合、パラメーターを設定する必要はありません。

ステートメントの実行

  • ALGORITHM=INSTANT 句を指定して、インスタント ADD COLUMN 機能を強制的に有効にします。例:

    ALTER TABLE <table_name> ADD COLUMN <column_name> int, ALGORITHM=INSTANT;
    説明

    インスタント ADD COLUMN 機能を使用してカラムを追加できず、ERROR 0A000: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE. エラーメッセージが返された場合、INSTANT アルゴリズムはサポートされていません。この場合、loose_innodb_support_instant_add_column パラメーターが ON に設定されているかどうか、および操作が制限されているかどうかを確認することをお勧めします。詳細については、「制限事項」をご参照ください。

  • アルゴリズムを指定しない場合、またはデフォルトのアルゴリズムを指定した場合、PolarDB はカラムを追加するための最速のアルゴリズムを選択します。例:

    ALTER TABLE <table_name> ADD COLUMN <column_name> int, ALGORITHM=DEFAULT;
    ALTER TABLE <table_name> ADD COLUMN <column_name> int;
    説明

    PolarDB は、INSTANT > INPLACE > COPY の優先順位でカラムを追加するためのアルゴリズムを選択します。

INSTANT アルゴリズムを使用して追加されたカラムの表示

  • PolarDB for MySQL 5.6 および 5.7 クラスターの場合、INNODB_SYS_INSTANT_COLUMNS という名前のテーブルが INFORMATION_SCHEMA データベースに追加されます。このテーブルには、即座に追加されたカラムに関する情報 (カラム名、カラムシーケンス番号、デフォルト値 (バイナリ値) など) が記録されます。新しく即座に追加されたカラムに関する情報を表示するには、次のステートメントを実行します。

    SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INSTANT_COLUMNS;
    説明

    テーブルにカラムを即座に追加し、DROP COLUMN などのテーブルを再作成する必要がある DDL 操作を実行した後、システムは即座に追加されたカラムに関する情報を INNODB_SYS_INSTANT_COLUMNS テーブルから削除します。

  • PolarDB for MySQL 8.0 クラスターの場合、次のステートメントを実行してテーブルのカラムを表示します。インスタント ADD COLUMN 機能を使用してカラムが追加された場合、has_default パラメーターの値は 1 になります。

    SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS WHERE TABLE_ID = (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = "<database_name>/<table_name>");

お問い合わせ

DDL 操作についてご質問がある場合は、お問い合わせください。