-. Instant add column 이란?
기존 INPLACE 등의 방식에서 대용량 테이블에 add column default value 수행은
full scan 등을 유발하여 처리가 오래걸릴 뿐만 아니라 Master <-> slave 간 replication LAG 이 발생하기 때문에 데이터 동기화에도 문제가 생김
이를 해결하고자 나온 것이 INSTANT algorithm 으로 mysql 8.0 / MariaDB 10.3.x 버전에서 default 로 사용됨
원리는 ORACLE에서 LOB 데이터를 테이블 segment 처럼 따로 저장하는 것과 같이
instant add column으로 생성된 컬럼을 테이블과 따로 저장하고 meta data 만 연결시켜주는 방식
-. Instant algorithm 사용 시
mysql> show create table sbtest.sbtest1\G; *************************** 1. row *************************** Table: sbtest1 Create Table: CREATE TABLE "sbtest1" ( "id" int(11) NOT NULL AUTO_INCREMENT, "k" int(11) NOT NULL DEFAULT 0, "c" char(120) COLLATE utf8_bin NOT NULL DEFAULT '', "pad" char(60) COLLATE utf8_bin NOT NULL DEFAULT '', PRIMARY KEY ("id"), KEY "k_1" ("k") ) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 1 row in set (0.00 sec)
=> 테스트용 테이블 생성
mysql> alter table sbtest.sbtest1 add column instant int default 0, algorithm=INSTANT; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select count(*) from sbtest.sbtest1 where instant=0; +----------+ | count(*) | +----------+ | 10000000 | +----------+ 1 row in set (33.84 sec)
=> 천만건에 대해 default value add column 이 바로 수행됨
mysql> SELECT * FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'; +-----------------------------+----------------+ | VARIABLE_NAME | VARIABLE_VALUE | +-----------------------------+----------------+ | INNODB_INSTANT_ALTER_COLUMN | 1 | +-----------------------------+----------------+ 1 row in set (0.00 sec)
=> instant column 의 갯수로 mysql 8.0 에서는 각각 테이블과 instant column들의 정보를 조회할 수 있으나 mariadb 에서는 관련 정보가 한정됨
Seconds_Behind_Master: 0
=> slave 에서 show slave status 조회시 replication lag 도 없이 동기화 됨 확인
-. 기존 INPLACE 방식으로 수행시
mysql> alter table sbtest.sbtest1 add column non_instant int default 0, algorithm=inplace; Query OK, 0 rows affected (51.34 sec) Records: 0 Duplicates: 0 Warnings: 0
Seconds_Behind_Master: 739
=> 수행도 오래걸리고 replication lag 발생 확인