개발을 하던 중 히스토리성 데이터를 디비에 저장해야 될 일이 있었는데 그 중에 파라미터에 관련된 데이터를 저장해야되는 필드가 있었다. 동적인 데이터이기 때문에 가변성 타입인 varchar 타입으로 한 후 길이를 설정하려고 하는데 이게 상황에 따라서 길수도 있고 짧을 수도 있어 고민에 빠졌다.
정말 간단하게는 text 타입을 쓰게되면 이런 길이 고민은 할 필요 없어지지만 성능에 영향을 미치기에 최대한 신중히 고민 후 선택하기로 했다. 그 과정에서 알게된 내용을 정리한다.
MySql char varchar text 정리
먼저 각각의 대해서 기본개념에 대해서 정리한다.
char
- 고정 길이이다.
- 0~255까지 길이를 저장 가능하다.
- 고정 길이 만큼 디스크 공간을 차지한다.
- 저장 후 남은 공간을 채우기 위해 남은 공간의 공백이 뒤에 채워진다.
- 채워진 공백은 해당 row를 가지고 올때 빼고 가져온다.
- PAD_CHAR_TO_FULL_LENGTH 해당 설정에 따라 빼고 가지고 올지 말지 설정 가능하다.
- index 가능하다
- char(n)에서 n은 문자 수이며 최대 길이는 255이다.
- 주민등록 번호나 핸드폰 번호와 같이 길이가 고정된 데이터에 적합하다.
- 디폴트 값 null 가능
varchar
- 가변형 이다.
- 저장된 문자열 만큼의 디스크 공간을 차지한다.
- varchar(n)에서 n은 마찬가지로 문자 수를 의미하고 최대 공간은 65535 바이트이다.
- 실제 범위는 65532 또는 65533 이다
- 헤더가 1 또는 2 바이트를 차지하기 때문
- utf-8 인코딩일때 최대 65532/3 -> 21844자를 저장한다.
- MySql 5.0.3 이전 버전에서 n은 바이트 수를 나타내며 이후 버전에서는 문자 수를 나타낸다.
- index 가능하다.
- 디폴트 값 null 가능
text
- varchar 보다 더 큰 값을 저장 가능하다. (위에서 말했듯이 가장 간단한 방법)
- index가 불가능하며 디폴트 값도 가질 수 없다.
- 최대 65535 자의 문자를 저장할 수 있다.
정리
당연히 검색 속도로 비교 시 char가 가장 빠르고, 그 다음으로는 varchar, text 순이다.
조회를 많이 해야되는 데이터이면서 조회 대상도 많다고 쳤을 때 성능상 이슈를 생각 안할 수 없다. 그렇기 때문에 데이터의 길이가 예상이 되지 않는다고 무조건 text 타입으로 지정하는 것은 옳지 않다. 예상이 되는 않는 데이터의 내용에서는 뺄 내용은 없는지, 아니면 꼭 그 많은 데이터를 다 같이 저장해야되는지 등등 여러 고민을 해본 후에 타입을 생각해서 정하는 것이 좋다.
타입을 정한 뒤 시간이 흐른 후에 다시 타입을 바꾸기란 쉽지가 않다. 큰 서비스일수록 더 쉽지 않을 것이다. 그러니 각각의 데이터 타입의 특성을 파악하고 여러 케이스와 추후 유지보수 측면에서도 생각한 후에 타입을 정하길 추천한다.
'Database' 카테고리의 다른 글
H2 Database 연동 및 콘솔 접속 방법 정리 (+runtimeOnly) (0) | 2023.02.22 |
---|---|
MongoDB - bulkWrite() 를 이용한 대량 쓰기 작업 처리 (0) | 2023.02.18 |
MySQL - 특정 데이터 포함 확인 LOCATE / INSTR / LIKE (0) | 2022.08.19 |
MySql - Datetime 과 Timestamp 차이점 및 날짜형 데이터 타입 정리 (0) | 2022.04.22 |
DataGrip - 테이블 정보 한눈에 확인하는 방법 (0) | 2022.02.21 |
댓글