MySQL Online DDL(6) [Generated Column Operations]

Database/Mysql & Mariadb / /
728x90

 

Generated ColumnMysql 5.7.6 부터 지원되는 DataType으로 2가지 방식을 지원한다.

1.      VIRTUAL 방식

A.     데이터를 저장하지 않고 정의만 하여 딕셔너리만 추가하는 방식

B.      해당 컬럼을 읽으려고 할 때 Trigger 로 열이 계산된다.

C.      저장 용량은 늘어나지 않지만 조회 시 마다 계산 작업이 추가적으로 발생됨

2.      STORED 방식

A.     딕셔너리 및 데이터를 저장하는 방식

B.      데이터가 입력되거나 수정될 때 연산되어 열에 저장된다.

C.      저장 용량이 늘어나고 CU 작업 시 계산 작업이 추가적으로 발생됨

생성 시 아무 설정을 하지 않으면 기본값으로는 VIRTUAL 방식으로 생성된다.

아래는 Online DDL 작업 시 지원 내역이다.


 

Stored Column 추가

COPY 알고리즘으로만 가능하기 때문에 고 비용이 발생되고 임시테이블에서 작업 후 교체가 진행된다.

COPY 만 지원되는 이유는 컬럼 생성 시 바로 열을 계산하여 데이터까지 저장하기 때문이다.

auto-increment 열과 연산하여서는 생성할 수 없다.

desc alter_test_tbl;

+-------+---------------+------+-----+---------+----------------+

| Field | Type          | Null | Key | Default | Extra          |

+-------+---------------+------+-----+---------+----------------+

| a     | int           | NO   | PRI | NULL    | auto_increment |

| b     | varchar(100)  | YES  | MUL | NULL    |                |

| c     | varchar(100)  | YES  |     | NULL    |                |

| d     | varchar(1000) | YES  |     | NULL    |                |

+-------+---------------+------+-----+---------+----------------+

 

ALTER TABLE alter_test_tbl

ADD (e varchar(200) GENERATED ALWAYS AS (concat(b,'_test')) STORED),

ALGORITHM=COPY, LOCK=SHARED;

 

desc alter_test_tbl;

+-------+---------------+------+-----+---------+------------------+

| Field | Type          | Null | Key | Default | Extra            |

+-------+---------------+------+-----+---------+------------------+

| a     | int           | NO   | PRI | NULL    | auto_increment   |

| b     | varchar(100)  | YES  | MUL | NULL    |                  |

| c     | varchar(100)  | YES  |     | NULL    |                  |

| d     | varchar(1000) | YES  |     | NULL    |                  |

| e     | varchar(200)  | YES  |     | NULL    | STORED GENERATED |

+-------+---------------+------+-----+---------+------------------+

 

SELECT b,e FROM alter_test_tbl LIMIT 2;

 

+---------------------------+--------------------------------+

| b                         | e                              |

+---------------------------+--------------------------------+

| test2                     | test2_test                     |

| d876c93a-...-000d3ad76afd | d876c93a-...-000d3ad76afd_test |

+---------------------------+--------------------------------+

 

 

Stored Column 수정

생성과 마찬가지로 COPY 알고리즘만 사용이 가능하다. 그 사유도 같다.

생성과 다른 점은 Temporary Table 에서 작업 후 교환하는 것이 아닌 해당 Table의 저장공간에서 일어난다는 것이다.

ALTER TABLE alter_test_tbl MODIFY e VARCHAR(200)

GENERATED ALWAYS AS (concat(C,'_test')) STORED,

ALGORITHM=COPY, LOCK=SHARED;

 

SELECT b,c,e FROM alter_test_tbl LIMIT 2;

 

+------------+---------------------------+--------------------------------+

| b          | c                         | e                              |

+------------+---------------------------+--------------------------------+

| test2      | d876c45d-...-000d3ad76afd | d876c45d-...-000d3ad76afd_test |

| d876c93a...| d876c93f-...-000d3ad76afd | d876c93f-...-000d3ad76afd_test |

+------------+---------------------------+--------------------------------+

 

Stored Column 삭제

InPlace 알고리즘을 사용 가능하나 Table Rebuild는 발생된다. 하지만 InPlace가 가능함으로 LockNone이 가능하여 CURD가 동시 작업이 가능하다.

ALTER TABLE alter_test_tbl DROP e, ALGORITHM=INPLACE, LOCK=NONE;

 

Virtual Column 생성

딕셔너리만 수정하는 하는 작업으로 Instant 알고리즘 사용이 가능하다

desc alter_test_tbl;

+-------+---------------+------+-----+---------+----------------+

| Field | Type          | Null | Key | Default | Extra          |

+-------+---------------+------+-----+---------+----------------+

| a     | int           | NO   | PRI | NULL    | auto_increment |

| b     | varchar(100)  | YES  | MUL | NULL    |                |

| c     | varchar(100)  | YES  |     | NULL    |                |

| d     | varchar(1000) | YES  |     | NULL    |                |

+-------+---------------+------+-----+---------+----------------+

 

ALTER TABLE alter_test_tbl

ADD (e varchar(200) GENERATED ALWAYS AS (concat(b,'_test')) VIRTUAL),

ALGORITHM=INSTANT;

 

desc alter_test_tbl;

+-------+---------------+------+-----+---------+-------------------+

| Field | Type          | Null | Key | Default | Extra             |

+-------+---------------+------+-----+---------+-------------------+

| a     | int           | NO   | PRI | NULL    | auto_increment    |

| b     | varchar(100)  | YES  | MUL | NULL    |                   |

| c     | varchar(100)  | YES  |     | NULL    |                   |

| d     | varchar(1000) | YES  |     | NULL    |                   |

| e     | varchar(200)  | YES  |     | NULL    | VIRTUAL GENERATED |

+-------+---------------+------+-----+---------+-------------------+

 

Virtual Column 수정

수정 시에는 COPY 알고리즘만 사용이 가능한데 열의 순서 등이나 연산되기 위한 다른 컬럼의 자료가 변경되기 안되기 때문에 Shared Lock이상의 잠금이 필요하기 때문이다.

ALTER TABLE alter_test_tbl

MODIFY e VARCHAR(200) GENERATED ALWAYS AS (concat(C,'_test')) VIRTUAL FIRST,

ALGORITHM=COPY, LOCK=SHARED;

 

desc alter_test_tbl;

+-------+---------------+------+-----+---------+-------------------+

| Field | Type          | Null | Key | Default | Extra             |

+-------+---------------+------+-----+---------+-------------------+

| e     | varchar(200)  | YES  |     | NULL    | VIRTUAL GENERATED |

| a     | int           | NO   | PRI | NULL    | auto_increment    |

| b     | varchar(100)  | YES  | MUL | NULL    |                   |

| c     | varchar(100)  | YES  |     | NULL    |                   |

| d     | varchar(1000) | YES  |     | NULL    |                   |

+-------+---------------+------+-----+---------+-------------------+

 

SELECT * FROM alter_test_tbl LIMIT 1;

 

+-----------------------+---+-------+------------------+------+

| e                     | a | b     | c                | d    |

+-----------------------+---+-------+------------- ----+------+

| d876c45d-...6afd_test | 1 | test2 | d876c45d-...6afd | 0    |

+-----------------------+---+-------+------------------+------+

 

Virtual Column 삭제

생성과 마찬가지로 Instant 알고리즘으로 딕셔너리에서 바로 삭제 가능하다.

ALTER TABLE alter_test_tbl DROP e, ALGORITHM=INSTANT;

 

desc alter_test_tbl;

+-------+---------------+------+-----+---------+----------------+

| Field | Type          | Null | Key | Default | Extra          |

+-------+---------------+------+-----+---------+----------------+

| a     | int           | NO   | PRI | NULL    | auto_increment |

| b     | varchar(100)  | YES  | MUL | NULL    |                |

| c     | varchar(100)  | YES  |     | NULL    |                |

| d     | varchar(1000) | YES  |     | NULL    |                |

+-------+---------------+------+-----+---------+----------------+

 

참조

https://mysqldba.tistory.com/277

https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-primary-key-operations

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기