mysql 새로운 컬럼 추가할때도 table lock 걱정하지마세요
https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html
mysql 5.6 이후부터 online ddl operation이 등장하였습니다
이전에는 테이블 관련 스키마를 변경하는 경우에 table lock이 걸려서 해당 작업이 끝날때까지 조회만 가능할뿐
DML이 동작을 하지 않았는데요
5.6 이후부터는 스키마를 변경하면서도 DML을 함께 사용할수 있습니다
ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INPLACE, LOCK=NONE;
위의 쿼리 예제를 보면 기존 쿼리 뒤에 ALGORITHM과 LOCK 옵션을 통해서 지정이 가능합니다
각 명령어마다 사용할수 있는 ALGORITHM, LOCK은
위에 링크한 문서에 어떤 동작에서 어떤 것을 적용할수 있는지 케이스별로 정리가 되어있습니다
그리고 버전별로 지원 내역에 차이가 있습니다
8.0이상부터는 INSTANT algorithm도 사용할수 있는데 훨씬 성능이 좋다라고 이해하면 되겠네요
문서에서 예를 하나 가져왔습니다
column과 관련된 명령어들입니다
Operation | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
---|---|---|---|---|
Adding a column | Yes | Yes | Yes* | No |
Dropping a column | Yes | Yes | Yes | No |
Renaming a column | Yes | No | Yes* | Yes |
Reordering columns | Yes | Yes | Yes | No |
Setting a column default value | Yes | No | Yes | Yes |
Changing the column data type | No | Yes | No | No |
Extending VARCHAR column size |
Yes | No | Yes | Yes |
Dropping the column default value | Yes | No | Yes | Yes |
Changing the auto-increment value | Yes | No | Yes | No* |
Making a column NULL |
Yes | Yes* | Yes | No |
Making a column NOT NULL |
Yes* | Yes* | Yes | No |
Modifying the definition of an ENUM or SET column |
Yes | No | Yes | Yes |
각 명령어별로 4개의 컬럼들이 보이는데요
각각의 컬럼은
In Place = INPLACE 알고리즘을 지원하는지
Rebuild table = 테이블 재구성을 하는지(값비싼 작업)
Permit Concurrent DML = 해당 작업을 수행중에 DML을 사용할수 있는지
Only Modifies Metadata = 메타데이터만 수정하는지(속도가 빠름)
이렇 의미를 담고 있습니다
In Place가 YES인 경우는 해당 알고리즘이 DML을 허용하기 때문에 Permit Concurrent DML도 마찬가지로 YES이며
Only Modifies Metadata가 YES로서 메타데이터만 수정하여 가능한 명령어의 경우
Rebuild Table을 수행하지 않아 NO로 표시가 되어있습니다
예를들어 컬럼을 추가하는 명령을 보면 In Place 알고리즘을 지원하며 Rebuild Table이 발생합니다 그리고 동시 DML을 허용합니다
Rebuild Table은 내부적으로 테이블을 재구성한다는 의미이며 대체로 비싼 동작입니다