varchar vs text 비교

Bonjugi·2023년 5월 6일

저장공간 측면에서 비교

둘다 가변길이로, Hello 저장하면 5바이트를 사용한다. (인코딩에 따라 다르긴 하다)
TINYINT 등등 모두 가변길이라 문자열 저장하는데 저장공간을 염려할 필욘 없을것 같다.
대략 b-tree 인덱스를 걸수 있냐 없냐 정도의 차이일듯 하다.

text

  • 최대크기 65535 캐릭터로 고정
  • 2+c 바이트 디스크공간을 차지한다. (c=character length를 말함. 길이를 저장하기 위해 varchar보다 1바이트 정도 더 쓸수 있다.)
  • 인덱스의 일부가 될수 없다. (근데 gin 인덱스같은걸 걸수 있긴 하다. b-tree 얘기일듯)

varchar(M)

  • M 문자의 가변 최대크기
  • M은 1~65535 사이여야 함
  • 인덱스에 일부가 될수 있다.

출처 :

temporary table 사용시 비교

그러나 성능면에서 차이가 나는경우가 발생할수 있다.
temporary table 만들때 TEXT는 disk에서, varchar는 memory에서 처리한다고 한다.

출처 : Performance difference between Text and Varchar in Mysql

temporary table는, group by 를 쓸때 사용된다고 한다.
(이외에도 from 조인이라던지. 내부적으로 테이블을 만들어내고 쿼리하는 동작들이 있었는데 가물가물..)

저장되는 구조 비교 (mysql, postgresql 다름)

또한 mysql 과 postgresql 은 좀 다를수 있다.

varchar도 이론적으로는 64KB까지 저장할 수 있지만
다른 컬럼들과 모두 합쳐서 64KB가 한계이므로, 실제로는 64KB까지 저장할 수 없습니다. (테이블 구조에 따라 한계가 달라집니다.)
또한 varchar 컬럼은 다른 컬럼들과 동일한 공간에 저장되고, text 컬럼은 별도의 공간에 저장되므로
너무 큰 varchar 컬럼이 중간에 끼어있으면 레코드가 무거워져서 검색 성능에 영향을 미칠 수 있습니다.
255자 이상 되는 값은 가능하면 text 컬럼을 사용하세요.
단, 위의 얘기는 mysql에만 해당됩니다. postgresql의 경우 varchar와 text는 아무 차이도 없습니다.

출처 : https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=201487

결론

mysql의 경우 저장 방식에 따른 차이가 있을것 같다.
레코드 내 다른 컬럼들과 함께 저장되는 mysql은 확실히 고민이 필요해 보인다.
그러나 postgresql 은 구분된 동작이 아닌듯 하다.
이외에는 거의 비슷한것 같다.
그럼에도 1차적으로 varchar 를 택하는게 안전해 보인다.

  1. 언제 b-tree 인덱스를 걸게 될지도 모르는데 text는 걸수 없음
  2. text는 항상 1바이트 정도 손해봄
  3. text는 temparary table 을 쓸때 disk 에서 처리 함.
    3-1. 근데 이건 varchar(1000) 무리해서 메모리 로드를 시도 하는걸로 보이기도 하고.. 잘 모르겠다.
  4. varchar의 길이 제한 거는게 제약처럼 보이기도 하지만, 일종에 validation 이기도 함.

0개의 댓글