ApsaraDB RDS for MySQL のカラムの即時追加機能を使用すると、テーブル全体の再構築を回避し、テーブルのメタデータのみを変更することで、列を迅速に追加できます。この操作は、テーブルのデータ量に関係なく数秒で完了します。この機能は、システムリソースの使用を最小限に抑え、テーブルをロックせず、ビジネス運用をブロックしません。頻繁なテーブルスキーマの拡張と高い業務継続性が求められるシナリオに最適です。
機能説明
ApsaraDB RDS for MySQL のカラムの即時追加は、データディクショナリ内のメタデータを変更することで、ADD COLUMN 操作を最適化します。この機能は、従来のデータ定義言語 (DDL) 操作で必要とされたテーブル全体の変更や再構築を回避します。その結果、テーブルのデータ量に関係なく、列の追加は数秒で完了します。
次の表は、カラムの即時追加と従来の列追加を比較したものです。
比較項目 | 従来の列追加 (Copy または Inplace モード) | RDS のカラム即時追加 (Instant モード) |
列追加時間 | テーブル全体の再構築が必要です。所要時間はテーブルサイズに比例します。 | 操作はメタデータのみを変更し、数秒で完了します。 |
リソース消費 | I/O やメモリなど、大量のシステムリソースを一時的に使用します。 | 追加のリソースはほとんど使用しません。 |
ビジネスへの影響 | 長時間トランザクションや高い同時実行性のシナリオでは、オンラインのビジネス運用をブロックする可能性があります。 | テーブルをロックしたり、操作をブロックしたりしません。 |
テーブルサイズ制限 | 大規模テーブルでの高速な列追加はサポートされていません。 | あらゆるサイズのテーブルで高速な列追加をサポートします。 |
適用範囲
カラムの即時追加機能を使用するには、ご利用のインスタンスが次のバージョン要件を満たす必要があります。インスタンスが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。
MySQL 8.0:すべてのマイナーエンジンバージョンがサポートされています。
MySQL 5.7:マイナーエンジンバージョン 20250331 以降。
カラムの即時追加機能には、次の制限事項があります:
エンジン制限:InnoDB エンジンのみがサポートされています。
テーブルタイプ制限:この機能は、圧縮テーブル、フルテキストインデックスを持つテーブル、または一時テーブルではサポートされていません。
操作制限:複数の操作をマージすることはサポートされていません。たとえば、列とインデックスを同時に追加することはできません。
読み取り専用インスタンスの制限:読み取り専用インスタンスがアタッチされている高可用性プライマリインスタンスでカラムの即時追加を使用する場合、プライマリインスタンスと読み取り専用インスタンスの両方で `loose_innodb_instant_ddl_enabled` パラメーターを ON に設定する必要があります。そうしないと、読み取り専用インスタンスへのレプリケーションが中断されます。
デフォルトの列位置:
MySQL バージョン
マイナーエンジンバージョン
列の位置
5.7
20250331 以降
デフォルトで最後の列が選択されます。
8.0
20230630 より前
デフォルトは最後の列です。
20230630 以降
新しい列の位置を指定できます。
カラムの即時追加の有効化
MySQL 8.0 では、インスタント列追加はデフォルトで有効になっており、パラメーターを変更することなくこの機能を使用できます。MySQL 5.7 の場合、インスタント列追加を有効にするには、以下のステップに従う必要があります。
[RDS インスタンス] ページに移動し、リージョンを選択してから、対象インスタンスの ID をクリックします。
左側のナビゲーションペインで、[パラメーター] をクリックします。
[編集可能なパラメーター] タブで、
loose_innodb_instant_ddl_enabledパラメーターを見つけ、[実行中のパラメーター値] を [ON] に設定します。説明loose_innodb_instant_ddl_enabledパラメーターへの変更は、インスタンスを再起動しなくてもすぐに有効になります。[パラメーターの送信] をクリックします。ダイアログボックスで、変更を有効にする時間範囲を選択し、[OK] をクリックします。
関連操作
カラムの即時追加の使用
カラムの即時追加を強制するには、
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:
-- 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データベースに追加されます。次の 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:
次の SQL 文を実行して、テーブルの列情報を表示できます。クエリ結果の
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>");