문자열

이전의 내용 CHAR vs VARCHAR 에서는 문자열 관련 칼럼에서 주로 사용되는 CHARVARCHAR에서의 비교를 했다면, 문자열 관련해서 데이터를 저장할 수 있는 TEXT와 그와 유사한 VARCHAR를 함께 정리해보고자 합니다.

VARCHAR

VARCHAR

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

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

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

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

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

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

Link to original

TEXT

  • 65535 이상은 불가: VARCHAR와 마찬가지 로 최대 65,535의 길이까지 저장이 가능합니다.

  • 필요할때마다 로드:VARCHAR와 다르게 메모리에 캐싱을 하지 않습니다. 필요할 때마다 데이터를 할당하고, 해제하게 됩니다.

  • Full Index는 불가능: TEXT에 인덱스를 생성하기 위해서는 반드시 Prefix 형태로 길이 지정이 필요합니다.

  • default은 표현식으로만 :TEXT의 기본 값을 사용하기 위해서는 반드시 표현식 형태로 작성되어야 합니다.

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

VARCHAR vs TEXT

  • VARCHAR의 길이를 기준으로 결정할 요소가 아니다.
  • VARCHAR는 메모리에 캐싱되기 때문에, 빈번하게 사용되고 메모리 공간이 여유롭다면 사용하는 경우에 적합함.
  • 반대로 VARCHAR를 남발하면 MySQL의 ROW 최대 사이즈 제한에 걸릴 수 있기 때문에 TEXT 와 적절히 사용해야 합니다.

Q. SELECT * vs SELECT {column}

필요한 Column만 가져오는 것이 보다 효율이 좋은데, VARCHARTEXT처럼 External Page에 저장되는 Column 들이 있을 수 있기 때문입니다. 실제로 External Page에 저장되는 값들을 포함한다면 4배가량 쿼리 처리 성능이 느려지게 됩니다.

또한, 필요한 Column 들을 가져오는 것은 Covering Index 를 사용할 수 있는 확률을 높여주기도 합니다.

Reference