RDS for MySQL は、メタデータのみを変更することで数秒でカラムを追加できる「即時 ADD COLUMN」機能をサポートしています。この機能は、テーブル全体の再構築を回避し、テーブルサイズにかかわらず動作します。即時 ADD COLUMN は、ほぼ追加のシステムリソースを消費せず、テーブルをロックせず、他の操作をブロックしません。テーブルスキーマを頻繁に拡張する必要があり、高い業務継続性が求められる場合にご使用ください。
機能概要
RDS for MySQL は、ADD COLUMN 操作を最適化するための「即時 ADD COLUMN」機能をサポートしています。従来のようにテーブルの全データを変更または再構築するのではなく、データディクショナリ内のメタデータのみを更新します。これにより、テーブルサイズにかかわらず、数秒でカラムを追加できます。
以下の表に、即時 ADD COLUMN と従来のカラム追加方法を比較します。
比較項目 | 従来のカラム追加(COPY または INPLACE モード) | RDS 即時 ADD COLUMN(INSTANT モード) |
カラム追加に要する時間 | テーブル全体の再構築が必要であり、テーブルサイズが大きくなるほど所要時間が増加します。 | メタデータのみを更新するため、数秒で完了します。 |
リソース消費量 | I/O やメモリなど、一時的に大量のシステムリソースを消費します。 | 追加のリソースをほとんど消費しません。 |
業務への影響 | 長時間トランザクション実行中や高い同時実行性の状況下では、オンラインワークロードをブロックする可能性があります。 | テーブルをロックせず、他の操作をブロックしません。 |
テーブルサイズ制限 | 大規模なテーブルでは高速なカラム追加はサポートされていません。 | 任意のサイズのテーブルで動作します。 |
適用範囲
即時 ADD COLUMN を使用するには、RDS インスタンスが以下のいずれかのエンジンバージョン要件を満たす必要があります。マイナーエンジンバージョンが要件を満たさない場合は、マイナーエンジンバージョンを更新してください。
MySQL 8.0:すべてのマイナーエンジンバージョンが対応しています。
MySQL 5.7:マイナーエンジンバージョンが 20250331 以降である必要があります。
即時 ADD COLUMN には以下の制限があります:
ストレージエンジン:InnoDB エンジンのみがサポートされています。
テーブルタイプ:圧縮テーブル、フルテキストインデックスを持つテーブル、および一時テーブルはサポートされていません。
操作:複数の操作を組み合わせることはできません。たとえば、カラム追加と同時にインデックスを作成することはできません。
読み取り専用インスタンス:プライマリインスタンスで高可用性が有効になっており、読み取り専用インスタンスがアタッチされている場合、`loose_innodb_instant_ddl_enabled` パラメーターを、プライマリインスタンスおよび読み取り専用インスタンスの両方で ON に設定する必要があります。設定しないと、読み取り専用インスタンスでのレプリケーションが停止する可能性があります。
カラムのデフォルト位置:
MySQL バージョン
マイナーエンジンバージョン
カラム位置
5.7
20250331 以降
デフォルトで、最後のカラム位置が選択されます。
8.0
20230630 より前
デフォルトで、新しいカラムは最後のカラムになります。
20230630 以降
新しいカラムの位置を指定できます。
MySQL 5.7 または MySQL 8.0(20230630 より前)の場合、テーブルに暗黙のプライマリキーが存在しないことを確認してください。
即時 ADD COLUMN の有効化
MySQL 8.0 では、即時 ADD COLUMN がデフォルトで有効です。パラメーターの変更は不要です。MySQL 5.7 の場合は、以下の手順に従ってください。
RDS インスタンス ページに移動します。ご利用のインスタンスが配置されているリージョンを選択し、対象インスタンスの ID をクリックします。
左側のナビゲーションウィンドウで、パラメーター をクリックします。
変更可能なパラメーター タブで、
loose_innodb_instant_ddl_enabledを検索します。実行中の値 列で、値を ON に設定します。説明loose_innodb_instant_ddl_enabledの変更は即時に反映されます。再起動は不要です。変更の適用 をクリックします。表示されるダイアログボックスで、変更の反映タイミングを選択し、OK をクリックします。
関連操作
即時 ADD COLUMN の使用
ALGORITHM=INSTANTを指定して、強制的に即時 ADD COLUMN を実行します:ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>, ALGORITHM = INSTANT;ALGORITHMを指定しない場合、RDS for MySQL が実行時に最適なモードを自動選択します:ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>;
即時 ADD COLUMN を使用したテーブルの確認
MySQL 5.7:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE INSTANT_COLS > 0;MySQL 8.0:
-- マイナーエンジンバージョンが 20230630 より前の場合 SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE INSTANT_COLS > 0; -- マイナーエンジンバージョンが 20230630 以降の場合 SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE TOTAL_ROW_VERSIONS > 0;
即時 ADD COLUMN で追加されたカラムの確認
MySQL 5.7:
MySQL 5.7 では、
INNODB_SYS_INSTANT_COLUMNSテーブルがINFORMATION_SCHEMAデータベースに追加されます。以下の SQL を実行して、即時 ADD COLUMN で追加されたカラムを確認できます: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:
以下の SQL を実行して、テーブルのカラム詳細を確認します。
HAS_DEFAULTカラムの値が 1 の場合、そのカラムは即時 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:インスタンスは即時 ADD COLUMN の要件を満たしていますが、カラム追加時に次のエラーが発生しました。「Feature not supported: 1845 ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.」
A:
原因: テーブルにプライマリキーもユニークキーも定義されていない場合、RDS for MySQL はレプリケーション効率を向上させるために暗黙のプライマリキーを追加します。この暗黙のプライマリキーはデフォルトで最後のカラムとして追加され、即時 ADD COLUMN による新規カラムの位置を特定の位置に固定します。しかし、MySQL 5.7 および MySQL 8.0(20230630 より前)では、特定の位置へのカラム追加はサポートされていません。
解決策: MySQL 5.7 または MySQL 8.0(20230630 より前)をご利用の場合、テーブルに暗黙のプライマリキーが存在しないことを確認してください。