데이터베이스/0 + MySQL

[MySQL] VARCHAR vs TEXT

힘들면힘을내는쿼카 2024. 7. 20. 18:16
728x90
반응형

 

  

 

이번에는 VARCHAR 와 TEXT에 대해서 알아봅시다! 🙌

 

공통점

  • 문자열 속성 값을 저장
  • 최대 65,535 bytes 까지 저장 가능

 

차이점

  • VARHCAR 타입 컬럼에는 지정된 글자 수 만큼만 데이터 저장 가능
    • VARCHAR(100) → 100글자 이하만 저장 가능
  • TEXT 타입 컬럼은 인덱스 생성 시 반드시 Prefix 길이 지정 필요
    • CREATE INDEX ix_text_column ON table (text_column(100));
  • TEXT 타입 컬럼은 표현식으로만 디폴트 값 지정 가능
    • CREATE TABLE tb1 (col TEXT DEFAULE ‘abc’) → 에러 발생
    • CREATE TABLE tb1 (col1 TEXT DEFAULT (’abc’)) → 생성 가능

 

일반적인 사용 형태

길이가 짧으면 VARCHAR? 길면 TEXT? 를 사용하면 될까?? 🤔

VARCHAR(5000) vs TEXT ?

  • VARCHAR 타입은 메모리 버퍼 공간을 미리 할당해두며 재활용이 가능합니다.
  • TEXT 타입은 그때 그때 필요할 때마다 할당 & 해제 합니다.
  • 컬럼 사용이 빈번하고 메모리 용량이 충분하다면 VARCHAR 타입 추천!
    • 오버헤드를 어느정도 줄일 수 있을 것!
  • VARCHAR(5000)과 같이 길이가 긴 컬럼들을 자주 추가하는 경우, Row 사이즈 제한(65,535 byte)에 도달할 수 있기 때문에 적절하게 TEXT 타입을 사용하는 것을 권장!

 

VARCHAR(30) vs VARCHAR(255) ?

  • 실제 최대 사용하는 길이만큼 명시해야 메모리 사용 효율이 증가합니다.
  • 디스크 공간 효율 차이도 미미하게 존재합니다.
    • VARCHAR 타입은 문자열 길이 저장 공간을 갖고 있기 때문!!
    • 1 byte vs 2 bytes

 

VARCHAR, TEXT 주의사항!

저장되는 값의 사이즈가 크면 Off-Page 형태로 데이터가 저장될 수 있습니다!!

쿼리에서 Off-Page 컬럼의 참조 여부에 따라 쿼리 처리 성능이 매우 달라질 수 있습니다.

 

실제 레코드를 읽을 때 기존 데이터 페이지뿐만 아니라 해당 컬럼에 대해서는 추가적인 데이터 페이지들을 읽어야 하기 때문입니다.

 

예시

user_log 테이블

  • extra_info_text 컬럼에는 off-page로 저장될 만큼 큰 데이터가 저장되어 있다고 가정
create table user_log (
    id bigint not null auto_increment,
    user_id int not null,
    ...,
    extra_info_text,
    primary key (id),
    key ix_userid (user_id)
)

 

만약 아래와 같은 2개의 쿼리문을 실행 했을 때 속도를 보면 아래와 같습니다.

extra_info_text를 포함하지 않은 select 쿼리

select user_id, email
from user_log
where user_id = 10;
==> 5000 rows in set (0.3 sec)

 

extra_info_text를 포함한 select 쿼리

select user_id, extra_info_text
from user_log
where user_id = 10;
==> 5000 rows in set (1.5 sec)

 

5배 정도의 시간이 차이나는 것을 확인 할 수 있습니다!!

필요에 따라서 extra_info_text 같은 off-page로 저장될 만큼 큰 데이터를 함께 조회하는 것은 지양하는 것이 좋습니다!

 

정리

이럴 때 VARCHAR 타입을 사용하자 👍

  • 상대적으로 저장되는 데이터 사이즈가 많이 크지 않고, 컬럼 사용이 빈번하며 DB 서버의 메모리 용량이 충분한 경우

 

이럴 때 TEXT 타입을 사용하자  🙌

  • 저장되는 데이터 사이즈가 큰 편이고, 컬럼을 자주 사용하지 않으며 테이블에서 다른 문자열 컬럼들이 많이 사용되고 있는 경우

 

타입을 설정할 때 쿼리 성능을 고려하자! 👏

  • VARCHAR 타입을 사용하는 경우, 길이는 실제 사용되는 만큼만 지정
  • 쿼리의 select 절에는 가능하면 필요한 컬럼들만 명시하도록 합시다!
    • 필요한 컬럼만 명시하면, 커버링 인덱스 방식으로 처리될 가능성이 높습니다 ^^
    • 테이블의 대형 데이터 저장 컬럼이 존재할 경우 쿼리 처리 성능이 안좋아 집니다… ㅠㅠ

 

커버링 인덱스란?!

  • 쿼리를 충족시키는데 필요한 모든 데이터를 갖고 있는 인덱스를 의미!

 

참고

 

Real MySQL 시즌 1 - Part 1 강의 | 이성욱 - 인프런

이성욱 | MySQL의 핵심적인 기능들을 살펴보고, 실무에 효과적으로 활용하는 방법을 배울 수 있습니다. 또한, 오랫동안 관성적으로 사용하며 무심코 지나쳤던 중요한 부분들을 새롭게 이해하고,

www.inflearn.com

 

728x90
반응형