Instant ADD COLUMN – MariaDB Server 10.3 新機能
MariaDB Server 10.3.2 以降,Instant ADD COLUMN が追加されており,大規模なテーブルに対しても新たなカラム(column)の追加を非常に高速に行うことが可能になっています。
また,現在ベータ版の MariaDB Server 10.4 では Instant DROP COLUMN も追加されています。
本投稿では,Instant ADD/DROP COLUMN について解説致します。
Instant ADD COLUMN
Instant ADD COLUMN は2017年4月に MariaDB Corporation,Alibaba,Tencent の開発者の間で初期デザインが議論され. Tencent Games DBA チームの陈福荣様により,プロトタイプが開発されました。
Instant ADD COLUMN for InnoDB – Marko Mäkelä
その後 MariaDB Corporation により再実装され,MariaDB Server 10.3.7 で GA となりました。
制限事項
現状以下の機能上の制限があります。
- 追加したカラムは最後列に追加される
- FULLTEXT INDEX が利用されている場合,Instant ADD COLUMN は利用不可
- ROW_FORMAT=COMPRESSED が利用されている場合,Instant ADD COLUMN は利用不可
利用方法
Instant ADD COLUMN は以下のように利用することが可能です。
alter table t1 add column note varchar(50) algorithm=instant;
Reference: https://staging-mdb.com/kb/en/library/alter-table/#algorithm
サンプルテーブルを作成,比較的大量のデータをインポートし,Instant ADD COLUMN の実行時間を測定してみます。
サンプルテーブル作成,テストデータインポート
create table t1 (id int primary key) engine=innodb; mysqlimport test t1.csv
ここで,サンプルデータ t1.csv には 1億行のデータがあります。
カラム追加テスト
note という名前で varchar(50) のカラムを追加してみます。
MariaDB [test]> alter table t1 add column note varchar(50), algorithm=instant; Query OK, 0 rows affected (0.002 sec) Records: 0 Duplicates: 0 Warnings: 0
わずか 0.002 秒でカラム追加を行うことができました。比較として ALGORITHM=COPY で実施してみます。
MariaDB [test]> alter table t1 add column (note varchar(50)), algorithm=copy; Query OK, 100000000 rows affected (4 min 54.706 sec) Records: 100000000 Duplicates: 0 Warnings: 0
ALGORITHM=COPY ではほぼ 5分かかりました。
ALTER TABLE 実行中は SELECT 以外のクエリが実行できませんので,大規模なテーブルの場合,サービス提供に支障をきたす場合があると想像されます。
Instant DROP COLUMN
今度は反対に追加したカラムを削除(DROP)してみます(開発版の10.4が必要になります)。
MariaDB [test]> desc t1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | note | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.001 sec) MariaDB [test]> alter table t1 drop column note, algorithm=instant; Query OK, 0 rows affected (0.002 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [test]> desc t1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.001 sec)
DROP COLUMN も非常に高速であることが確認できました。なお,インデックスが定義されているカラムでは ALGORITHM=INSTANT は適用できません。
まとめ
今回はMariaDB Server 10.3 以降デフォルトとなる ALTER TABLE .. [ADD|DROP] COLUMN .. ALGORITHM=INSTANT では,非常に高速なスキーマ変更が可能となることが確認できました。これによりMariaDB Serverを運用する上で,非常に高い柔軟性が得られるものと考えます。