문자열

MySQL에서는 문자열 관련 칼럼을 사용할 때에는 CHAR 타입과 VARCHAR 타입 중 어떤 타입을 사용할지 결정해야 합니다. CHAR/VARCHAR와 함께 크기를 지정할 수 있는데(CHAR(8)) 이 때 크기는 바이트 크기가 아닌 문자의 수라는 것에 유의해야 합니다. 문자의 수기 때문에, 이를 저장하는 문자의 인코딩에 따라 바이트 사용량이 달라지게 됩니다.

CHAR

  • 고정 길이: 입력되는 칼럼값의 길이에 따라 사용하는 저장 공간의 크기가 변하지 않음.
    • 한번 저장된 공간은 그 공간이 변하지 않는다는 것을 의미

VARCHAR

  • 가변 길이: 최대로 저장할 수 있는 값의 길이는 제한되어 있지만, 필요한 만큼 저장 공간을 유연하게 조절.

    • 내부적으로는 성능적인 이슈가 발생할 수 있음을 인지해야 합니다.
      • 길이가 변경됨에 따른 물리적인 위치의 변화

      • 물리적인 위치가 변할 수 있기 때문에 다음과 같은 비용이 추가로 생길 수 있음

        • 메모리 이동에 대한 비용
        • 인덱스 재스캔에 대한 비용
  • 추가 비트: 현재 문자열의 유효 크기를 계산하기 위한 1~2바이트의 저장공간이 추가로 더 필요.

    • 최대 2바이트를 사용 가능하다는 것은 비트, 즉 65,536 이상으로 설정할 수 없다는 것을 의미.
  • 메모리 캐시: 메모리 버퍼 공간에 VARCHAR의 최대 길이에 해당하는 값을 할당받아 사용하기 때문에 효율적인 접근이 가능합니다.

  • External Page : 저장하는 데이터의 양이 너무 커지게 되면, 외부의 PAGE에 실제 데이터가 저장되고 포인터만을 가지고 있게 되는 경우가 있습니다. 이는 쿼리 처리 성능에 영향을 주게 됩니다.

CHAR vs VARCHAR

Q. 저장되는 문자열의 길이가 서로 비슷한가요?

문자열의 길이가 비슷하다면 CHAR과 같이 고정된 문자열을 사용하는 것이 유리합니다.

Q. 문자열의 값이 자주 변경되나요?

업데이트가 발생하는 문자열의 경우, VARCHAR 이용시 디스크/인덱스 재정렬 비용과 그에 따른 내부 파편화 현상이 발생한다는 것을 유의해야 합니다. 그렇기 때문에 해당 상황에서는 CHAR를 사용하는 것이 유리합니다.

Q. VARCHAR(30) vs VARCHAR(255)

  • 메모리에는 VARCHAR의 최대 길이만큼 사전 할당하기 때문에 사용하는 길이만큼 적절하게 사용하는 것이 메모리 사용효율에 도움을 받을 수 있습니다.

출처