데이터베이스 설계 시 데이터 타입 선택은 단순한 기술적 결정이 아닙니다. 이는 퍼포먼스, 저장 용량, 쿼리 최적화에 큰 영향을 미치며, 잘못된 선택은 성능 저하와 데이터 무결성 문제로 이어질 수 있습니다.
TINYINT
, SMALLINT
, MEDIUMINT
, INT
, BIGINT
중 적절한 타입을 선택해야 합니다.CHAR
)와 가변 길이(VARCHAR
)의 차이를 이해하고 사용해야 합니다.VARCHAR(255)
와 CHAR(255)
의 차이점은 데이터 크기와 패딩 처리 방식에서 나타납니다.MySQL은 다양한 숫자형 데이터 타입을 제공합니다.
정수형 (Integer Types)
TINYINT
: 1바이트, -128 ~ 127 (부호 있음)SMALLINT
: 2바이트, -32,768 ~ 32,767MEDIUMINT
: 3바이트, -8,388,608 ~ 8,388,607INT
/INTEGER
: 4바이트, -2,147,483,648 ~ 2,147,483,647BIGINT
: 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
: 정확한 소수점 계산이 필요한 경우 사용 (금융 데이터 등)고정 길이 문자열
CHAR(n)
: n바이트 고정 길이, 짧은 문자열에 적합가변 길이 문자열
VARCHAR(n)
: 최대 n바이트 가변 길이, 길이가 자주 변하는 데이터에 적합텍스트 타입
TINYTEXT
, TEXT
, MEDIUMTEXT
, LONGTEXT
: 대용량 텍스트 데이터 저장 시 사용DATE
: 'YYYY-MM-DD' (3바이트)TIME
: 'HH:MM:SS' (3바이트)DATETIME
: 'YYYY-MM-DD HH:MM:SS' (8바이트)TIMESTAMP
: UNIX 타임스탬프, 자동 시간 업데이트에 유용데이터 타입 선택 시 저장 공간 절약과 성능 최적화 사이의 균형을 맞춰야 합니다. 예를 들어, 큰 정수를 저장할 필요가 없다면 INT
대신 SMALLINT
를 사용하는 것이 더 효율적입니다.
DECIMAL
을 사용하는 것이 좋습니다.VARCHAR
필드에 인덱스를 설정할 경우, 길이 제한을 두는 것이 효율적입니다.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
);
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)
);