Data Type에 대한 이해 - Numeric

Ryan·2025년 1월 15일

SQL/Python 분석

목록 보기
52/94

1. 정수형(Numeric Data – INT 계열)

MySQL에서 숫자를 정수로 다룰 때 사용되는 자료형은 다음과 같이 크게 5가지가 있습니다.

TypeStorage (Bytes)Minimum Value (Signed)Maximum Value (Signed)
TINYINT1-128127
SMALLINT2-3276832767
MEDIUMINT3-8,388,6088,388,607
INT4-2,147,483,6482,147,483,647
BIGINT8-2^632^63 - 1

1) SIGNED vs. UNSIGNED

  • SIGNED: 음수와 양수를 모두 저장 가능. (예: 128 ~ 127 for TINYINT)
  • UNSIGNED: 음수를 제외하고 양수만 저장 가능. 대신 최대 양의 범위가 SIGNED보다 2배가량 늘어납니다. (예: 0 ~ 255 for TINYINT)

2) 각 자료형 선택 시 고려사항

  • 범위: 저장할 데이터의 최대/최소값을 미리 고려해서, 필요한 범위를 커버하는 최소 자료형을 고르는 것이 좋습니다(메모리 사용, 성능 최적화 차원).
  • 성능: 보통 자료형이 작을수록(바이트가 작을수록) 인덱스 효율성이 향상될 수 있습니다. 다만, 실제로는 DB 설계 및 하드웨어, 인덱스 구조에 따라 차이가 있으므로 범위와 성능을 균형 있게 고려합니다.
  • 예를 들어, 나이, 카운트(수량)가 0255 정도로 충분하면 TINYINT UNSIGNED를 쓸 수도 있습니다. 부서 번호, 직책 번호 등이 065535 범위면 SMALLINT UNSIGNED 등이 가능합니다.

2. 실수형(Numeric Data – Float 계열)

MySQL에서 실수(부동소수점, 고정소수점)를 다룰 때 주로 사용되는 자료형은 다음과 같습니다.

TypeStorage (Bytes)연산속도소수점 타입
FLOAT4부동소수점
DOUBLE8부동소수점
DECIMAL16고정소수점

1) FLOAT vs. DOUBLE

  • FLOAT(4바이트)는 비교적 적은 메모리를 사용하며, 소수점 정밀도가 DOUBLE보다 낮습니다.
  • DOUBLE(8바이트)는 FLOAT보다 2배 메모리를 사용하지만, 좀 더 높은 정밀도를 제공합니다.
  • 둘 다 부동소수점(Approximate Numeric)으로, 매우 큰 수나 매우 작은 수를 표현하기에 유리하지만 오차가 발생할 수 있습니다(IEEE 754 표준의 특성).

2) DECIMAL (고정소수점, Fixed-Point)

  • DECIMAL은 숫자 전체 자릿수(precision)와 소수점 이하 자릿수(scale)를 명시적으로 지정하여 정밀도(Accuracy)를 유지하는 자료형입니다.
  • 금융, 회계와 같이 소수점 이하 정밀도가 매우 중요한 경우(오차 허용 불가) 주로 사용합니다.
  • 내부적으로 문자열 기반으로 처리되어 FLOAT/DOUBLE에 비해 연산 속도가 떨어질 수 있지만, 오차가 없는 정확한 연산이 가능합니다.

3. 자료형 선택 팁

  1. 정수형:
    • 다루려는 데이터 범위를 먼저 파악해 가장 작은 범위로 커버할 수 있는 자료형을 선택
    • 음수가 필요한지(마이너스 값이 발생하는지) 고려 -> UNSIGNED 사용 가능성 체크
  2. 실수형:
    • 오차 허용 범위를 먼저 확인
    • 일반적으로 과학적 계산(예: 센서 데이터, 로그 값)처럼 거대 범위 표현 & 일부 오차 허용 시 FLOAT/DOUBLE
    • 금전, 결제 등 극도로 정확한 계산이 필요하면 DECIMAL
    • 정밀도와 메모리 사용, 연산 속도 사이의 트레이드오프를 고려해야 함
  3. 범위/정밀도 vs. 성능
    • 더 큰 자료형일수록 저장공간과 인덱싱 시 부담이 늘어날 수 있습니다.
    • 너무 작아 범위를 초과하는 경우 오류나 데이터 손실이 발생할 수 있으니 유의해야 합니다.

4. 예시: 테이블 컬럼 설계

예를 들어, 임의의 주문 테이블(orders)를 구성할 때 다음과 같은 고민 과정을 거칠 수 있습니다:

sql
코드 복사
CREATE TABLE orders (
    order_id      INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    customer_id   MEDIUMINT UNSIGNED NOT NULL,
    product_id    INT UNSIGNED NOT NULL,
    order_qty     SMALLINT UNSIGNED NOT NULL,
    order_price   DECIMAL(10,2) NOT NULL,
    discount_rate FLOAT DEFAULT 0,
    order_date    DATETIME NOT NULL
);
  • order_id: 전체 데이터가 수천만 건 이상 될 수 있다고 가정, INT UNSIGNED(4바이트, 최대 42억여 건)면 충분하다고 판단.
  • customer_id: 고객 ID는 수백만 정도 가능하므로, MEDIUMINT UNSIGNED(약 1천6백만) 정도로 커버 가능.
  • order_qty: 상품 주문량(주로 수백 ~ 수천) 정도면 SMALLINT UNSIGNED(최대 65535)로 충분.
  • order_price: 금액이므로 오차 없는 연산이 필요. 소수 둘째 자리까지 표현해야 하므로 DECIMAL(10,2) 사용.
  • discount_rate: 할인율 등은 정밀도 큰 오차가 발생해도 큰 문제가 없으므로, FLOAT로 처리(일부 오차 감수).

5. 마무리

  • 정수형(TINYINT ~ BIGINT)과 실수형(FLOAT, DOUBLE, DECIMAL) 중 어떤 자료형을 선택하느냐는 데이터 특성과 사용 목적에 달려 있습니다.
  • 데이터 범위정밀도, 성능(메모리, 연산속도), 오차 허용 여부 등을 종합적으로 고려해 적절한 자료형을 선택해야 합니다.
  • 특히 금융/회계 데이터나 재고 수량 같은 중요한 정보는 정밀도 보장을 위해 DECIMAL(또는 정수형으로 소수 부분을 따로 처리) 방식을 권장합니다.
  • 일반적인 수치 계산, 로그, 센서 데이터 수집 등에서는 FLOAT/DOUBLE이 더 나은 성능을 낼 수 있습니다.

0개의 댓글