ApsaraDB RDS for MySQL のインスタント列追加機能は、メタデータのみを変更することで列を迅速に追加します。この方法では、テーブルの再構築が不要になり、テーブルサイズに関係なく操作が数秒で完了し、消費するシステムリソースは最小限に抑えられます。テーブルロックや業務操作のブロックを引き起こさないため、頻繁なスキーマ拡張と高い事業継続性が求められるシナリオに最適です。
仕組み
ApsaraDB RDS for MySQL のインスタント列追加は、データディクショナリ内のメタデータを変更することで、ADD COLUMN 操作を最適化します。この機能により、従来の DDL 操作で必要とされた完全なデータコピーやテーブルの再構築が不要になり、テーブルサイズに関係なく数秒で列を追加できます。
次の表は、インスタント列追加の主な利点を従来の方法と比較したものです。
比較項目 | 従来の方法 (COPY または INPLACE アルゴリズム) | インスタント列追加 (INSTANT アルゴリズム) |
列の追加にかかる時間 | テーブルの再構築が必要で、テーブルサイズに比例した時間がかかります。 | メタデータのみを変更するため、操作は数秒で完了します。 |
リソース消費 | I/O やメモリなど、一時的に大量のシステムリソースを消費します。 | 追加のリソース消費はごくわずかです。 |
業務への影響 | 長時間実行されるトランザクション中や高同時実行シナリオでは、オンライン操作をブロックする可能性があります。 | テーブルロックやブロッキングは発生しません。 |
テーブルサイズの制限 | 大きなテーブルに列を追加する場合、処理が遅くなります。 | あらゆるサイズのテーブルに列を迅速に追加できます。 |
前提条件
インスタント列追加機能を使用するには、インスタンスが以下のバージョン要件を満たす必要があります。マイナーエンジンバージョンがサポートされていない場合は、マイナーエンジンバージョンを更新できます。
MySQL 8.4
MySQL 8.0
マイナーエンジンバージョンが 20250331 以降の MySQL 5.7
インスタント列追加機能を使用する際には、以下の制限が適用されます:
エンジンに関する制限: InnoDB ストレージエンジンのみがサポートされています。
テーブルタイプに関する制限: 圧縮テーブル、全文検索インデックスを持つテーブル、および一時テーブルはサポートされていません。
操作に関する制限: 列の追加とインデックスの作成など、単一のステートメントで複数の操作を組み合わせることはできません。
読み取り専用インスタンスに関する制限: 読み取り専用インスタンスを持つ高可用性プライマリインスタンスでインスタント列追加を使用する場合、プライマリインスタンスとそのすべての読み取り専用インスタンスの両方で
loose_innodb_instant_ddl_enabledパラメータを ON に設定する必要があります。そうしないと、読み取り専用インスタンスへのレプリケーションが中断されます。デフォルトの列位置:
MySQL バージョン
マイナーエンジンバージョン
列の位置
5.7
20250331 以降
新しい列はデフォルトで最後の列として追加されます。
8.0
20230630 より前
新しい列はデフォルトで最後の列として追加されます。
20230630 以降
新しい列の位置を指定できます。
8.4
すべてのマイナーエンジンバージョン
新しい列の位置を指定できます。
以下のバージョンのインスタンスでインスタント列追加を使用する場合、データテーブルに暗黙の主キーが含まれていないことを確認する必要があります:
MySQL 8.4
マイナーエンジンバージョンが 20230630 より前の MySQL 8.0
MySQL 5.7
インスタント列追加の有効化
MySQL 8.0 および 8.4 では、インスタント列追加はデフォルトで有効になっています。パラメータを変更することなくこの機能を使用できます。MySQL 5.7 の場合は、以下の手順に従ってインスタント列追加を有効にしてください:
[インスタンス] ページに移動し、リージョンを選択してから、対象インスタンスの ID をクリックします。
左側のナビゲーションペインで、パラメーターの設定 をクリックします。
変更可能なパラメーター タブで、
loose_innodb_instant_ddl_enabledパラメータを見つけます。適用中のパラメーター値 列で、値を ON に設定します。説明loose_innodb_instant_ddl_enabledパラメータの変更は、インスタンスを再起動することなく即時に有効になります。変更の送信 をクリックします。表示されるダイアログボックスで、変更を有効にするタイミングを指定し、OK をクリックします。
関連操作
インスタント列追加の使用
Instant ADD COLUMN を明示的に有効にするには、
ALGORITHM=INSTANTを使用します:ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>, ALGORITHM = INSTANT;ALGORITHM句を指定しない場合、ApsaraDB RDS for MySQL は実行時に最適なアルゴリズムを選択します:ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>;
変更されたテーブルの表示
MySQL 5.7:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE INSTANT_COLS > 0;MySQL 8.0 および 8.4:
-- 20230630 より前のマイナーエンジンバージョンの場合 SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE INSTANT_COLS > 0; -- 20230630 以降のマイナーエンジンバージョンの場合 SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE TOTAL_ROW_VERSIONS > 0;
追加された列の表示
MySQL 5.7:
MySQL 5.7 では、
INNODB_SYS_INSTANT_COLUMNSテーブルがINFORMATION_SCHEMAデータベースに追加されます。Instant ADD COLUMN 機能で追加された列を表示するには、次の SQL ステートメントを実行します。SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INSTANT_COLUMNS WHERE TABLE_ID = (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME = "<database_name>/<table_name>");MySQL 8.0 および 8.4:
テーブルの列情報を表示するには、次の SQL 文を実行します。
HAS_DEFAULT列の値が 1 の場合は、その列が Instant ADD COLUMN 機能を使用して追加されたことを示します。SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS WHERE TABLE_ID = (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = "<database_name>/<table_name>");
よくある質問
Q1: インスタンスはインスタント列追加の要件を満たしていますが、列を追加しようとすると次のエラーが表示されます:「Feature not supported: 1845 ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE」
A:
原因: テーブルにプライマリキーまたは一意キーがない場合、ApsaraDB RDS for MySQL はレプリケーション効率を確保するために、テーブルの末尾に暗黙の主キーを追加します。暗黙の主キーは最後の列でなければならないため、これにより ADD COLUMN ステートメントは事実上、位置指定操作になります。しかし、MySQL 5.7 およびマイナーエンジンバージョンが 20230630 より前の MySQL 8.0 インスタンスでは、ALGORITHM=INSTANT を使用した位置指定の列追加はサポートされていません。この競合がエラーの原因となります。
解決策: MySQL 5.7 またはマイナーエンジンバージョンが 20230630 より前の MySQL 8.0 インスタンスでインスタント列追加を使用する場合は、対象のテーブルに暗黙の主キーがないことを確認してください。