-
mysql varchar size변경개발/MySQL 2021. 9. 28. 11:36
출처 - https://kimdubi.github.io/mysql/varchar/
대량의 데이터가 적자될 것으로 예상되는 테이블에 컬럼 추가 필요성을 느껴 작업을 하게 되었다.
문제는 스펙에 사이즈가 나와있어, 해당 사이즈를 명확히 할 것인지.
스펙을 정의한 곳에 신뢰가 완전하지 않아 여유를 둘 것인지에 대한 고민이다.
물론 varchar형태가 가변형이기 때문에 크게 해도 성능상 이슈가 없으니 미리 크게 잡아두는게 편하지 않냐는 생각과
명확한 사이즈를 통해 해당 길이의 패턴이나 의미전달을 할 수 있지 않을까란 생각이 또 충돌하였다.
추후 사이즈를 변경하는것에 대한 부담감을 갖지 않도록 사이즈 변경은 db에 무리없이 작업할 수 있는지 알아봤다.
1. varchar size 256 bytes 이하구간에서 증가시키는 경우
### varchar(1) => varchar(63) mysql> alter table test modify a varchar(63), algorithm=inplace, lock = none; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0
metadata만 변경되므로 부담없다.
2. 256bytes 이하에서 256bytes이상으로 증가시키는 경우
### vachar(63) => varchar(64) mysql> alter table test modify a varchar(64), algorithm=inplace, lock = none; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
algorithm=COPY 방식을 사용하여야 한다.
즉 부담될 수 있다.
3. 256bytes 이상에서 증가시키는 경우
### varchar(64) => 그 이상 mysql> alter table test modify b varchar(640), algorithm=inplace, lock = none; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0
metadata만 변경되므로 부담없다.
4. 사이즈를 줄이는 경우
Table: test Create Table: CREATE TABLE `test` ( `a` varchar(63) DEFAULT NULL, `b` varchar(640) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec) mysql> alter table test modify b varchar(600), algorithm=inplace, lock = none; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY. mysql> alter table test modify a varchar(1), algorithm=inplace, lock = none; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
algorithm=COPY 방식을 사용하여야 한다.
즉 부담될 수 있다.
정리.
- 사이즈를 증가하는 경우 크기가256bytes을 지나치게 된다면 algorithm=COPY 방식을 사용하여야 해서 부담이 될 수 있다.
- 줄이는 경우는 크기와 상관없이 모두 algorithm=COPY 방식을 사용하여야 하기 때문에 부담된다.
기타
- charset이 utf8mb인 경우 1글자(varchar1)당 4byte이기 때문에 varchar(64)가 기준이 된다.
- charset이 utf8은 1글자당 3byte이고, varchar(86)이 기준이 된다.
- 256bytes가 기준이 되는 이유는 256bytes를 초과하게 되면 MySql 내부적으로 컬럼의 실제 저장 길이를 관리하는 flag가 1 byte에서 2byte로 커져야 하기 때문이다.
'개발 > MySQL' 카테고리의 다른 글
non clustered index 로 검색할때 order by, limit 조건에 따라 지연 현상(mysql) (0) 2021.06.25 클러스터드 인덱스와 넌 클러스터드 인덱스 (0) 2021.04.08 MySQL 프로시저 PROCEDURE 생성(CASE문, IF문)+ 추가 FUNCTION (0) 2019.04.02 댓글