문자열
이전의 내용 CHAR vs VARCHAR 에서는 문자열 관련 칼럼에서 주로 사용되는 CHAR과 VARCHAR에서의 비교를 했다면, 문자열 관련해서 데이터를 저장할 수 있는 TEXT와 그와 유사한 VARCHAR를 함께 정리해보고자 합니다.
VARCHAR
VARCHAR
Link to original
가변 길이: 최대로 저장할 수 있는 값의 길이는 제한되어 있지만, 필요한 만큼 저장 공간을 유연하게 조절.
- 내부적으로는 성능적인 이슈가 발생할 수 있음을 인지해야 합니다.
길이가 변경됨에 따른 물리적인 위치의 변화
물리적인 위치가 변할 수 있기 때문에 다음과 같은 비용이 추가로 생길 수 있음
- 메모리 이동에 대한 비용
- 인덱스 재스캔에 대한 비용
추가 비트: 현재 문자열의 유효 크기를 계산하기 위한 1~2바이트의 저장공간이 추가로 더 필요.
- 최대 2바이트를 사용 가능하다는 것은
비트, 즉 65,536 이상으로 설정할 수 없다는 것을 의미. 메모리 캐시: 메모리 버퍼 공간에 VARCHAR의 최대 길이에 해당하는 값을 할당받아 사용하기 때문에 효율적인 접근이 가능합니다.
External Page : 저장하는 데이터의 양이 너무 커지게 되면, 외부의 PAGE에 실제 데이터가 저장되고 포인터만을 가지고 있게 되는 경우가 있습니다. 이는 쿼리 처리 성능에 영향을 주게 됩니다.
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만 가져오는 것이 보다 효율이 좋은데, VARCHAR와 TEXT처럼 External Page에 저장되는 Column 들이 있을 수 있기 때문입니다. 실제로 External Page에 저장되는 값들을 포함한다면 4배가량 쿼리 처리 성능이 느려지게 됩니다.
또한, 필요한 Column 들을 가져오는 것은 Covering Index 를 사용할 수 있는 확률을 높여주기도 합니다.
