MySQL에서 TEXT 필드를 피하는 이유
분야
프로그래밍/소프트웨어 개발
대상자
MySQL 데이터베이스 관리자, 백엔드 개발자, 데이터베이스 설계 담당 엔지니어
핵심 요약
- TEXT 타입은 VARCHAR 대신 사용 시 성능 저하를 유발할 수 있습니다.
- TEXT는 overflow pages에 저장되어 메모리 사용량을 증가시킬 수 있습니다.
- TEXT 필드의 인덱싱은 prefix length 지정이 필요하며, unique index 시 중복 키 오류 발생 가능.
- MEMORY 스토리지 엔진은 TEXT를 지원하지 않아, 임시 테이블 사용 시 디스크에서 데이터를 읽어야 합니다.
섹션별 세부 요약
1. TEXT 타입 및 저장 방식
- MySQL의 TEXT 타입은
TINYTEXT
,TEXT
,MEDIUMTEXT
,LONGTEXT
로 구분되며, 각각의 저장 제한은 다음과 같습니다: TINYTEXT
: 0 - 255 bytesTEXT
: 0 - 65,535 bytesMEDIUMTEXT
: 0 - 16,777,215 bytesLONGTEXT
: 0 - 4,294,967,295 bytes- BLOB 또는 TEXT 값은 별도의 객체로 저장되며, 다른 데이터 타입은 컬럼 당 단일 공간을 할당합니다.
- InnoDB는 768바이트 이상의 고정 길이 필드를 overflow pages에 저장하고, 768바이트 미만은 데이터 행에 직접 저장합니다.
2. 성능 고려사항
- TEXT 필드는 max_sort_length (기본값 1024바이트)에 따라 정렬 시만 일부 데이터를 사용합니다.
- max_allowed_packet 변수를 조정하여 전송 가능한 최대 크기 제한을 조절할 수 있습니다.
- MEMORY 스토리지 엔진은 TEXT를 지원하지 않아, 임시 테이블 사용 시 디스크에서 데이터를 읽어야 합니다.
3. 인덱스 제한
- TEXT 필드를 unique index로 사용 시, 끝의 공백이 패딩되어 중복 키 오류 발생 가능.
- full-text index 생성 시 추가 계산 및 공간이 필요하며, 필드가 너무 크면 성능에 부정적입니다.
4. 추천 사항
- TEXT 필드를 피하고, 필요 시 VARCHAR(2000)을 사용하세요.
- TEXT 필드를 별도 테이블로 분리해 주 키로 연결하는 방식을 고려하십시오.
- 불필요한 SELECT * 대신 필요한 필드만 조회하고, 대용량 데이터는 OSS에 저장하는 것이 좋습니다.
결론
- *TEXT 타입은 성능, 리소스 소비, 인덱스 제한 등으로 인해 추천되지 않습니다. 대체 방안으로는 VARCHAR 사용, 별도 테이블 분리, OSS 저장 등이 있습니다. TEXT 필드를 사용할 경우, max_sort_length, max_allowed_packet 변수 조정, unique index 및 full-text index 제한 등을 고려해야 합니다. 실무에서는 불필요한 TEXT** 필드 조회를 최소화하고, 데이터베이스 설계 시 성능 최적화를 우선시해야 합니다.