MySQL 데이터 타입

숭맹이·2025년 2월 5일
0

1. 데이터 타입의 중요성

데이터베이스 설계 시 데이터 타입 선택은 단순한 기술적 결정이 아닙니다. 이는 퍼포먼스, 저장 용량, 쿼리 최적화에 큰 영향을 미치며, 잘못된 선택은 성능 저하데이터 무결성 문제로 이어질 수 있습니다.

성능 최적화

  • 정수형 데이터 타입은 크기와 범위를 고려하여 선택해야 하며, 불필요한 메모리 낭비를 피하기 위해 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 중 적절한 타입을 선택해야 합니다.
  • 문자형 데이터는 고정 길이(CHAR)와 가변 길이(VARCHAR)의 차이를 이해하고 사용해야 합니다.

저장 용량 최적화

  • 데이터 타입에 따라 디스크 공간 사용량이 달라지므로, 스토리지 비용과 퍼포먼스를 고려해야 합니다.
  • 예: VARCHAR(255)CHAR(255)의 차이점은 데이터 크기와 패딩 처리 방식에서 나타납니다.

2. 주요 데이터 타입

2.1 숫자형 데이터 타입

MySQL은 다양한 숫자형 데이터 타입을 제공합니다.

  • 정수형 (Integer Types)

    • TINYINT: 1바이트, -128 ~ 127 (부호 있음)
    • SMALLINT: 2바이트, -32,768 ~ 32,767
    • MEDIUMINT: 3바이트, -8,388,608 ~ 8,388,607
    • INT/INTEGER: 4바이트, -2,147,483,648 ~ 2,147,483,647
    • BIGINT: 8바이트, -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • 부동 소수점 (Floating-Point Types)

    • FLOAT: 4바이트, 단정밀도 부동 소수점
    • DOUBLE: 8바이트, 배정밀도 부동 소수점
  • 고정 소수점 (Fixed-Point Types)

    • DECIMAL: 정확한 소수점 계산이 필요한 경우 사용 (금융 데이터 등)

2.2 문자열 데이터 타입

  • 고정 길이 문자열

    • CHAR(n): n바이트 고정 길이, 짧은 문자열에 적합
  • 가변 길이 문자열

    • VARCHAR(n): 최대 n바이트 가변 길이, 길이가 자주 변하는 데이터에 적합
  • 텍스트 타입

    • TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT: 대용량 텍스트 데이터 저장 시 사용

2.3 날짜 및 시간 데이터 타입

  • DATE: 'YYYY-MM-DD' (3바이트)
  • TIME: 'HH:MM:SS' (3바이트)
  • DATETIME: 'YYYY-MM-DD HH:MM:SS' (8바이트)
  • TIMESTAMP: UNIX 타임스탬프, 자동 시간 업데이트에 유용

3. 데이터 타입 선택 시 고려사항

3.1 공간과 성능의 균형

데이터 타입 선택 시 저장 공간 절약성능 최적화 사이의 균형을 맞춰야 합니다. 예를 들어, 큰 정수를 저장할 필요가 없다면 INT 대신 SMALLINT를 사용하는 것이 더 효율적입니다.

3.2 데이터 무결성과 정확성

  • 부동 소수점 타입은 정확도가 요구되는 상황(예: 금융 데이터)에서는 피하고, 대신 DECIMAL을 사용하는 것이 좋습니다.
  • 문자열 길이 제한을 적절히 설정하여 예상치 못한 데이터 손실을 방지합니다.

3.3 인덱스와 데이터 타입

  • 인덱스를 걸 데이터의 경우, 고정 길이 데이터가 인덱스 성능에 더 유리합니다.
  • VARCHAR 필드에 인덱스를 설정할 경우, 길이 제한을 두는 것이 효율적입니다.

4. 실전 적용: 최적의 데이터 타입 설계

예제 1: 사용자 정보 테이블 설계

CREATE TABLE users (
  user_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  email VARCHAR(100) NOT NULL,
  password CHAR(64) NOT NULL, -- SHA-256 해시 값 저장
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

예제 2: 금융 거래 테이블 설계

CREATE TABLE transactions (
  transaction_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  user_id INT UNSIGNED NOT NULL,
  amount DECIMAL(15, 2) NOT NULL, -- 소수점 2자리까지 정확한 금액 저장
  transaction_date DATE NOT NULL,
  status ENUM('pending', 'completed', 'failed') NOT NULL,
  INDEX (user_id),
  FOREIGN KEY (user_id) REFERENCES users(user_id)
);
profile
👨🏻‍💻 Backend Developer

0개의 댓글