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://mariadb.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 は適用できません。

ALTER TABLE – DROP COLUMN

まとめ

今回はMariaDB Server 10.3 以降デフォルトとなる ALTER TABLE .. [ADD|DROP] COLUMN .. ALGORITHM=INSTANT では,非常に高速なスキーマ変更が可能となることが確認できました。これによりMariaDB Serverを運用する上で,非常に高い柔軟性が得られるものと考えます。