[TIL] MySQL의 데이터 타입

cjkangme·2023년 8월 6일
0

TIL

목록 보기
18/29

데이터 타입

SQL 기반의 관계형 데이터베이스에서 하나의 필드는 모두 같은 데이터 타입을 사용해야 한다.
RDBMS 종류마다 조금씩 명칭이 다를 수는 있지만, 대체로 비슷한 구조를 갖고 있고, 여기서는 가장 많이 사용하는 MySQL 기준 데이터 타입을 알아보도록 하자.

숫자타입

타입용량(byte)최솟값(부호 O)최댓값(부호 O)최댓값(부호X)
TINYINT1-128127255
SMALLINT2-327683276765535
MEDIUMINT3-8388608838860716777215
INT4-21474836482147483647...
BIGINT8.........

문자타입

CHAR

  • 저장된 문자열 길이에 상관 없이 고정된 크기를 갖는 문자타입
  • 0~255 사이의 크기를 갖는다.

예시
CHAR(4)
"A", "BB", "CCC", "DDDD"
4 + 4 + 4 + 4 = 16 bytes

VARCHAR

  • 저장된 문자열에 따라 길이가 변하는 문자 타입
  • 0~65535 사이의 크기를 갖는다.
  • 0~255까지의 문자열은 크기 저장을 위해 1byte의 오버헤드를 갖고, 256~65535까지의 문자열은 크기 저장을 위해 2byte의 오버헤드를 갖는다.

예시
VARCHAR(4)
"A", "BB", "CCC", "DDDD"
2 + 3 + 4 + 5 = 14 bytes

TEXT

  • 문자열의 길이를 미리 선언하지 않고 사용하는 문자 타입
  • 0~65535 사이의 크기를 가질 수 있으며 무조건 2byte의 오버헤드를 사용한다.

BLOB

  • 이미지, 동영상 등 용량이 큰 데이터를 저장할 때 사용하는 타입이다.
  • 실무에서는 DB에 이미지나 동영상을 저장하지 않고, 호스팅 서버에 이미지나 동영상을 저장해놓고 여기에 접근할 수 있는 URL 경로를 문자열로 저장하여 사용하는 경우가 많다.

VARCHAR VS TEXT

참고자료 : https://medium.com/daangn/varchar-vs-text-230a718a22a1

  • 설명만 보면 무조건 VARCHAR가 공간 면에서 유리할 것 같지만 TEXT를 사용해야하는 경우가 있다.
  • TEXT와 BLOB은 LOB(Large OBject)라고 하여 실제 데이터가 테이블에 저장되지 않고 Off-Page라는 외부 공간에 저장한다.
    • 따라서 너무 크지 않은 문자열(InnoDB의 레코드 제한을 넘지 않는)이라면 VARCHAR로 저장하는 것이 성능에 유리하다.
    • VARCHAR여도 할당된 크기가 클 경우 Off-Page에 저장된다.
  • VARCHAR는 테이블 구조체 내의 records[2] 메모리 객체, 메모리 포인터를 통해 데이터를 입출력하는데, 이로 인해 테이블이 호출될 때 모든 데이터가 메모리에 적재된다.
    반면 TEXT는 records[2] 메모리 객체에 할당되지 않아 불러올 때 메모리를 할당하고, 이를 해제하는 작업이 필요하다
    • 따라서 최대 길이가 비교적 작거나, 해당 컬럼에 자주 접근하고, 메모리가 충분하다면 VARCHAR를 선택하는 것이 좋다
    • 최대 길이가 비교적 크고, 컬럼에 자주 접근하지 않고, 메모리가 불충분하다면 TEXT를 선택하는 것이 좋다.

날짜타입

DATE

  • 날짜만 있고 시간 부분은 없는 값 (3바이트)
  • 범위 : 1000-01-01 ~ 9999-12-31

DATETIME

  • 날짜와 시간을 모두 포함하는 값 (8바이트)
  • 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
  • 날짜와 시간을 표시하는 객체를 저장한다.

TIMESTAMP

  • 날짜와 시간을 모두 포함하는 값 (4바이트)
  • 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07
  • DATETIME보다 표현되는 범위가 훨씬 좁다.
  • 1970년 1월 1일 00:00:00을 기준으로 흐른 시간을 정수로 저장한다.

열거형 문자타입

문자타입의 일종이지만 여러개의 데이터를 열거하여 하나 이상을 선택할 수 있는 타입이다.

ENUM

  • 열거된 데이터들 중 하나만 선택하여 사용할 수 있을 때 쓰인다.
  • x-small, small, medium, large, x-large 등으로 크기를 선택할 수 있으며 ENUM에서 선택 가능한 데이터 종류에 맞는 크기를 선택해야 효율적으로 메모리를 사용할 수 있다.
  • 열거된 데이터들이 0, 1 등으로 매핑되어 저장되기 때문에 메모리를 적게 사용할 수 있다.
  • 잘못된 값을 선택하면 빈 문자열을 반환한다.
  • 최대 65,535개의 요소를 넣을 수 있다.

SET

  • ENUM과 비슷하지만 여러개의 값을 선택할 수 있다.
  • 비트 단위 연산을 지원하며 최대 64개의 데이터만 집어넣을 수 있다.

실무에서의 ENUM과 SET

  • ENUM, SET은 메모리를 효율적으로 사용할 수 있다는 장점이 있어 하드웨어 자원을 가능한 적게 사용하여야 할 때 주로 사용한다.

  • 하지만 ENUM, SET의 요소를 수정하기 위해서는 정의된 내부 구조를 직접 수정해야한다. 이로 인해 유지보수성에 안좋은 영향을 끼칠 수 있다는 장점이 있다. (내부 구조 수정을 위해 잠시 DB 사용이 중단되거나 하는 경우)

  • 최근엔 하드웨어 스펙이 많이 개선되어 대부분의 경우 굳이 ENUM과 SET을 사용할 필요가 없다고 한다. (큰돌님 말씀...)

0개의 댓글