[MySQL] VARCHAR vs TEXT

2025. 6. 8. 12:53·스터디/Database
728x90

목차

     

     

     

    1. VARCHAR 의 크기 제약

    테이블을 정의할 때 아래와 같이 varchar 또는 text 로 컬럼을 정의합니다.

    alter table test_tb name varchar(100) not null;

     

    MySQL은 기본적으로 하나의 행(ROW)이 가질 수 있는 최대 행 크기를 65535 바이트로 제한하고 있습니다. 다음과 같은 테이블 생성 쿼리를 실행하면 실패하는 것을 확인할 수 있습니다.
    - 하나의 행이 가질 수 있는 최대 크기 = 65535byte
    - varchar 컬럼이 가질 수 있는 최대 크기 = 16383자리

     

    mysql> CREATE TABLE long_varchar (id INT PRIMARY KEY, fd1 VARCHAR(1000000));
    ERROR 1074 (42000): Column length too big for column 'fd1' (max = 16383); use BLOB or TEXT instead
    
    mysql> ALTER TABLE long_varchar ADD fd2 VARCHAR(10);
    ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

     

    varchar 는 가변 길이의 데이터를 저장하는 타입으로 한 문자를 나타냅니다. 즉 varchar(100)이라고하면 100개 문자를 저장한다는 의미입니다.

    이때 어떤 문자를 사용하는지에 따라 최종적으로 저장되는 크기가 달라집니다.

    • 영어: 1글자 당 1바이트
    • 한글: 1글자 당 3바이트
    • 이모지: 1글자 당 4바이트

     

    TEXT나 BLOB type 컬럼은 이런 제약사항에 거의 영향을받지 않습니다. 따라서 컬럼이 많은 테이블이라면 varchar 대신 text를 사용합니다.

    그럼 무조건 varchar 대신 text 로 사용하면되는거 아닐까?

     

    2. VARCHAR vs TEXT 

    저장방식

    varchar 는 B-Tree 로 저장되지만(inline 저장) text와 같이 대용량 데이터를 저장하는 LOB 컬럼 타입의 경우 B-Tree 외부의 off-page 로 저장되며, B-Tree 에는 이를 참조하는 포인터만 저장됩니다.

    이러한 구조로 성능차이가 발생합니다.

     

    성능차이

    상대적으로 text 타입은 메모리 버퍼를 사용할 수 없어 varchar 가 text 보다 더 빠릅니다.

    기본적으로 여러 커넥션이 같은 요청을 하더라도 버퍼는 한 번만 할당되어 이 버퍼를 공유하여 사용할 수 있는 캐싱기능이 내장되어있습니다.

    하지만 text 타입은 여러 커넥션에 대해 매번 text 컬럼 데이터의 실제 공간만큼 새로 할당하고 사용해야합니다.

    또한 text 는 전체 인덱싱이 불가능하여 반드시 일정 길이를 명시적으로 지정해야하지만 varchar 는 전체 인덱싱이 가능합니다.

    CREATE INDEX idx_column_name ON table_name(column_name(100));

     

    여기서 100은 TEXT 컬럼의 처음 100자를 인덱스로 사용하겠다는 의미입니다. TEXT 타입의 컬럼에 인덱스를 추가할 때, 인덱스로 사용될 문자열의 길이를 지정하지 않으면 오류가 발생합니다.

     

    사용제약

    text 는 다음 기능들에서 제약이 있습니다.

    • default 설정 불가
      • 기본값을 저장하려면 열의 크기를 사전에 지정해야됩니다. 하지만 BLOB, TEXT 와 같은 열은 가변 길이 데이터를 저장할 수 있으며 크기가 정해져있지 않습니다. 따라서 default 설정이 불가합니다.
    • group by, order by 등에서 직접 사용 시 성능 저하
      • 전체 값을 읽고 비교해야되는데 이 과정에서 디스크 접근이 더 발생해 i/o 비용이 크게 발생

     

     

    3. 그럼 언제 varchar 를 쓰고 언제 text  을 사용하나요?

    VARCHAR

    • 최대 길이가 (상대적으로) 크지 않은 경우
    • 테이블 데이터를 읽을 때 항상 해당 컬럼이 필요한 경우
    • 메모리가 상대적으로 충분한 경우

    TEXT

    • 최대 길이가 (상대적으로) 큰 경우
    • 테이블에 길이가 긴 문자열 타입 컬럼이 많이 필요한 경우
    • 테이블 데이터를 읽을 때 해당 컬럼이 자주 필요하지 않은 경우
    728x90
    저작자표시 비영리 변경금지 (새창열림)

    '스터디 > Database' 카테고리의 다른 글

    [MySQL] PK 컬럼 순서와 Index  (0) 2024.07.13
    [MySQL] 대용량 테이블 스키마 변경하기  (0) 2024.04.14
    [MySQL] TEXT Column cannot set default value  (0) 2023.08.12
    [DB] MySQL CharacterSet과 Collation  (0) 2022.11.12
    [MySQL] 다중 테이블 업데이트, 여러 테이블 update 하기  (1) 2022.10.06
    '스터디/Database' 카테고리의 다른 글
    • [MySQL] PK 컬럼 순서와 Index
    • [MySQL] 대용량 테이블 스키마 변경하기
    • [MySQL] TEXT Column cannot set default value
    • [DB] MySQL CharacterSet과 Collation
    zoodi
    zoodi
    IT/개발 관련 지식을 기록하는 블로그입니다.
    • zoodi
      오늘의 기록
      zoodi
    • 전체
      오늘
      어제
      • 분류 전체보기
        • 후기
          • 컨퍼런스
          • 일상리뷰
        • 금융경제
          • 뉴스
          • 금융IT용어
          • 경제 및 부동산
        • 코딩 테스트
        • 스터디
          • JAVA
          • Kotlin
          • Spring
          • React, Nextjs
          • 인공지능 AI
          • Cloud & k8s
          • Kafka
          • Database
          • Network
          • Algorithm
          • Hadoop
          • LINUX
          • R Programming
          • 기타 (소공, 보안)
        • 도서
        • 기타
    • 블로그 메뉴

      • 홈
      • 스터디
      • 금융경제
      • 후기
      • 기타
    • 링크

    • 공지사항

    • 인기 글

    • 태그

      코테
      코테공부
      CodingTest
      MySQL
      자료구조
      쿠버네티스
      자바
      프로그래머스
      코딩테스트
      db
      네트워크
      스프링
      java
      C++
      카카오코테
      LeetCode
      코딜리티
      금융용어
      이분탐색
      리트코드
      Spring
      pythoncodingtest
      Kotlin
      springboot
      스프링부트
      Python
      kafka
      codility
      코딩
      알고리즘
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.4
    zoodi
    [MySQL] VARCHAR vs TEXT
    상단으로

    티스토리툴바