목차
데이터 타입 선택 방법
MySQL은 다양한 데이터 타입을 지원하는데, 데이터에 적합한 데이터 타입을 고르는 것은 좋은 성능을 얻는 데 필수적입니다.
- 타입은 작을 수록 좋다.
보통 작은 데이터 타입일수록 디스크나 메모리, CU 캐시에 더 적은 공간을 사용하기 때문에 더 빠르며 덜 소비합니다.
하지만, 저장할 값의 크기를 너무 작게 추정하지 않도록 주의해야 합니다. 스키마의 이곳저곳에서 데이터 타입의 범위를 늘리는 작업은 어렵고 시간을 많이 소모하기 때문입니다. - 타입은 단순한 게 좋다.
보통 간단한 데이터 타입을 처리할 수록 CPU 사이클을 덜 소비합니다.
예를 들어 문자 비교는 문자 셋(Character set)과 콜레이션(Collation)으로 인해 복잡해지므로 문자 비교보다는 정수 비교가 비용이 더 저렴합니다. 날짜와 시간은 문자열로 저장하지 말고, MySQL의 내장 형식에 저장해야 하며, IP 주소는 정수를 이용해 저장해야 합니다. 참고로 IP 주소를 사용할 수 있는 함수로는 INET_ATON 함수와 INET_NTOA 함수가 있습니다. - 가능하면 NULL을 쓰지 말자
컬럼은 되도록 NOT NULL(NULL 허용 안함)로 정의해야 합니다. NULL 허용 컬럼은 저장 공간을 더 많이 사용하며, NULL 허용 컬럼을 인덱싱할 때 항목마다 한 바이트씩 더 들어갑니다.
만약, '값이 없다'라는 데이터 값을 표현하고 싶다면 NULL 대신 0이나 특수한 어떤 값, 빈 문자열 등을 사용하는 걸 고려해봅시다.
MySQL 데이터 타입
문자형
데이터 유형 | 정의 |
CHAR(n) | 고정 길이 데이터 타입(최대 255byte) - 지정된 길이보다 짧은 데이터가 입력될 시 나머지 공간을 공백으로 채운다. |
VARCHAR(n) | 가변 길이 데이터 타입(최대 65535byte) - 지정된 길이보다 짧은 데이터가 입력될 시 나머지 공간을 채우지 않는다. |
TINYTEXT(n) | 문자열 데이터 타입(최대 255byte) |
TEXT(n) | 문자열 데이터 타입 (최대 65535byte) |
MEDIUMTEXT(n) | 문자열 데이터 타입(최대 16777215byte) |
LONGTEXT(n) | 문자열 데이터 타입(최대 4294967295byte) |
JSON | JSON 문자열 데이터 타입 - JSON 형태의 포맷을 꼭 준수해야 한다. |
- VARCHAR vs TEXT
- VARCHAR
- 문자열의 길이가 정해진 경우 또는 상대적으로 작은 문자열을 저장해야 하는 경우에 적합합니다.
- 인덱스를 지원합니다. 문자열 검색 시 빠르게 조회할 수 있도록 인덱스를 생성할 수 있습니다.
- 기본값을 설정할 수 있습니다.
- TEXT
- 대용량의 텍스트 데이터를 저장해야 하는 경우에 사용됩니다. 긴 문장, 긴 문서 또는 BLOB(Binary Large OBject) 데이터 등을 저장할 때 유용합니다.
- 텍스트 데이터의 길이가 크기 때문에 일반적으로 인덱스를 사용하지 않습니다.
- 기본값 설정이 어렵습니다.
- VARCHAR
숫자형
데이터 유형 | 정의 |
TINYINT(n) | 정수형 데이터 타입(1byte) -128 ~ +127 또는 0 ~ 255 표현 |
SMALLINT(n) | 정수형 데이터 타입(2byte) -32768 ~ 32767 또는 0 ~ 65536 표현 |
MEDIUMINT(n) | 정수형 데이터 타입(3byte) -8388608 ~ +8388607 또는 0 ~ 16777215 표현 |
INT(n) | 정수형 데이터 타입(4byte) -2147483648 ~ +2147483647 또는 0 ~ 4294967295 표현 |
BIGINT(n) | 정수형 데이터 타입(8byte) - 무제한 수 표현 |
FLOAT(길이, 소수) | 부동 소수형 데이터 타입(4byte) - 고정 소수점 사용 형태 |
DECIMAL(길이, 소수) | 고정 소수형 데이터 타입고정(길이+1byte) - 소수점 사용 형태 |
DOUBLE(길이, 소수) |
부동 소수형 데이터 타입(8byte) - double을 문자열로 저장 |
날짜형
데이터 유형 | 정의 |
DATE | 날짜(년도, 월, 일) 형태 (3byte) |
TIME | 시간(시, 분, 초) 형태 (3byte) |
DATETIME | 날짜와 시간 형태 (8byte) |
TIMESTAMP | 날짜와 시간 형태 (4byte) - 시스템 변경 시 자동으로 그 날짜와 시간이 저장된다. |
YEAR | 년도 표현 (1byte) |
- DATETIME vs TIMESTAMP
- DATETIME
- 최대값의 제약이 없습니다.
- 자동으로 현재 날짜와 시간으로 설정되지 않고, 사용자가 직접 기본값을 설정해야 합니다.
- 시간대 정보를 저장하지 않으며, 저장된 값은 데이터베이스 서버의 시간대에 의존합니다.
- TIMESTAMP
- 최대값은 '2038-01-19 03:14:07' 이며, 32비트 시스템에서는 UNIX 타임 스탬프의 최대 값에 해당합니다.
- 자동으로 현재 타임스탬프로 설정됩니다. 즉, 기본값이 'CURRENT_TIMESTAMP'로 설정됩니다.
- 시간대 정보를 포함할 수 있습니다. 예를 들어, '2023-01-01 12:00:00 +03:00'
- DATETIME
이진 데이터
데이터 유형 | 정의 |
BINARY(n) & BYTE(n) | CHAR의 형태의 이진 데이터 타입 (최대 255byte) |
VARBINARY(n) | VARCHAR의 형태의 이진 데이터 타입 (최대 65535byte) |
TINYBLOB(n) | 이진 데이터 타입 (최대 255byte) |
BLOB(n) | 이진 데이터 타입 (최대 65535byte) |
MEDIUMBLOB(n) | 이진 데이터 타입 (최대 16777215byte) |
LONGBLOB(n) | 이진 데이터 타입 (최대 4294967295byte) |
참고
'프로젝트' 카테고리의 다른 글
[MySQL] MySQL 데이터 타입과 Java 데이터 타입 매칭 (0) | 2024.01.16 |
---|---|
[ERD] ERD Cloud 사용법 (0) | 2024.01.16 |