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 절에는 가능하면 필요한 컬럼들만 명시하도록 합시다!
- 필요한 컬럼만 명시하면, 커버링 인덱스 방식으로 처리될 가능성이 높습니다 ^^
- 테이블의 대형 데이터 저장 컬럼이 존재할 경우 쿼리 처리 성능이 안좋아 집니다… ㅠㅠ
커버링 인덱스란?!
- 쿼리를 충족시키는데 필요한 모든 데이터를 갖고 있는 인덱스를 의미!
참고
728x90
반응형
'데이터베이스 > 0 + MySQL' 카테고리의 다른 글
[MySQL] Stored Function 에서 많이 하는 실수 방지하기 (0) | 2024.08.21 |
---|---|
[MySQL] left join 아무생각 없이 사용하고 있는 것은 아니지? (0) | 2024.08.15 |
[MySQL] 페이징 쿼리 작성하기 (0) | 2024.07.21 |
[MySQL] count(*) 과 count(distinct) (2) | 2024.07.20 |
[MySQL] CHAR vs VARCHAR (0) | 2024.07.06 |