ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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로 커져야 하기 때문이다.

    댓글

Designed by Tistory.