2강. VARCHAR vs TEXT
1. VARCHAR vs TEXT
1-1. 공통점
문자열 속성 값을 저장
최대 65,535 Bytes 까지 저장 가능
1-2. 차이점
VARCHAR 타입 컬럼에는 지정된 글자 수 만큼만 데이터 저장 가능
varchar(10) → 10 글자 이하만 저장 가능
TEXT 타입 컬럼은 인덱스 생성 시 반드시 Prefix 길이 지정 필요
CREATE INDEX ix_text_column ON table (text_column(100));
TEXT 타입 컬럼은 표현식으로만 default 값 지정 가능
CREATE TABLE tb1 (col TEXT DEFAULT ‘abc’) → ERROR
CREATE TABLE tb1 (col TEXT DEFAULT(’abc’) → SUCCESS
1-3. 일반적인 사용 형태
길이가 짧으면 VARCHAR 타입, 길이가 길면 TEXT 타입
1-4. 그렇다면 VARCHAR(5000) vs TEXT ?
MySQL 에서 데이터를 저장하는 형태
MySQL 은 세션에서 어떤 메모리에 저장된 데이터를 읽는다고(SELECT) 할 때, 버퍼에 미리 공간을 마련해두고 유지하며 사용한다.
이 버퍼 공간은 테이블 레코드 사이즈 최대 공간(65,535 Byte)에 할당된다.
버퍼 공간을 사용함에 있어서, VARCHAR / TEXT 동작 방식의 차이가 있다.
VARCHAR 타입은 레코드 내부에 저장되기 때문에, 메모리 버퍼 공간을 미리 할당해두며 재활용 가능
TEXT 타입 중에서 큰 크기의 데이터는 레코드 외부에 저장되기 때문에, 그때마다 외부 디스크에서 I/O 가 발생한다.
때문에, 컬럼 사용이 빈번하고 메모리 용량이 충분하다면, VARCHAR 타입을 추천한다. → 레코드 내부에서 버퍼를 사용한다는 것은 IO 가 빠르다는 것을 의미한다.
VARCHAR(5000) 과 같이 길이가 긴 컬럼들을 자주 추가하는 경우, Row 사이즈 제한(65,535 Byte) 에 걸릴 수 있기 때문에, 적절하게 TEXT 타입과 같이 사용하는 것을 권장한다.
1-5. VARCHAR(30) vs VARCHAR(255) ?
실제 최대 사용하는 길이만큼 명시해야 메모리 사용 효율이 증가한다.
디스크 공간 효율 차이도 미미하게 존재한다.(1Byte vs 2Byte)
2. VARCHAR & TEXT 주의사항
데이터 페이지 MySQL 의 InnoDB 스토리지 엔진은 데이터를 페이지 단위로 관리한다. 이때, 기본적으로 데이터 페이지의 크기는 16KB 이다. (데이터 페이지 내에 데이터 로우가 존재한다)
저장되는 값의 사이즈가 크면 Off-Page 형태로 데이터가 저장될 수 있다.
만약, 하나의 레코드가 데이터 페이지의 절반을 넘게 차지할 경우, 레코드에서 외부로 저장할 가변길이 컬럼을 선택하게 되고, 그렇게 선택된 컬럼은 외부 페이지에 데이터가 저장되게 되고, 해당 컬럼이 저장되던 자리에는 20Byte 짜리 포인터 값이 저장된다.
이렇게 외부에 저장되는 페이지를 external off-page / overflow page 라고 불리게 된다.
2-1. 성능 이슈
쿼리에서 Off-Page 컬럼의 참조 여부에 따라 쿼리 처리 성능이 매우 달라질 수 있다.
3. 정리
상대적으로 저장되는 사이즈가 많이 크지 않고, 컬럼 사용이 빈번하며, DB 서버 메모리 용량이 충분하다면 VARCHAR 타입 권장
저장되는 데이터 사이즈가 큰 편이고, 컬럼을 자주 사용하지 않으며, 테이블에서 다른 문자열 컬럼들이 많이 사용되는 경우 TEXT 타입 권장
VARCHAR 타입을 사용하는 경우, 길이는 실제 사용되는 만큼만 지정
쿼리의 SELECT 절에는 가능하면 필요한 컬럼들만 명시하는 것이 좋다.
그렇지 않은 경우, 테이블에 대형 데이터 저장 컬럼 존재 시 쿼리 처리 성능 저하..
필요한 컬럼만 명시하면, 커버링 인덱스 방식으로 처리될 가능성 증가!
Last updated