데이터베이스 설계 중, 로그 남기는 부분에 DATETIME과 TIMESTAMP 둘 중에 뭘 선택할지 고민하다가 검색 & 조사하여 정리한 글이다.
1. 저장 가능 범위
- DATETIME
→ '1000-01-01 00:00:00.000000' ~ '9999-12-31 23:59:59.999999' - TIMESTAMP
→ '1970-01-01 00:00:01.000000' UTC ~ '2038-01-19 03:14:07.999999' UTC`
📖 8.4.11 Date and Time Data Types, “The DATETIME type”, “The TIMESTAMP type” (MySQL 8.4 Docs)
2. 저장 크기 (Storage Requirements)
- DATETIME: 5 bytes + fractional seconds storage (0~3 bytes)
- TIMESTAMP: 4 bytes + fractional seconds storage (0~3 bytes)
📖 11.7 Data Type Storage Requirements, Table 11.2 Storage Requirements for Temporal Types
3. 타임존 처리
- DATETIME: 입력된 값 그대로 저장/조회 (타임존 변환 없음)
- TIMESTAMP: 저장 시 “current time zone → UTC”, 조회 시 “UTC → current time zone” 변환
📖 8.4.11 Date and Time Data Types, “The TIMESTAMP type” 항목
4. 자동 초기화 / 자동 갱신
- DEFAULT CURRENT_TIMESTAMP 와 ON UPDATE CURRENT_TIMESTAMP → TIMESTAMP, DATETIME 둘 다 가능
- MySQL 5.6.5 이상부터 DATETIME도 지원
📖 8.4.12 Automatic Initialization and Updating for TIMESTAMP and DATETIME
5. 용도 구분 (공식 문서에 나온 권장 사용 패턴)
- DATETIME
- “values that contain both date and time parts”
- timezone-independent representation → 과거·미래의 특정 시각 그대로 저장
- TIMESTAMP
- “values that include both date and time, with automatic time zone conversion”
- 로그, 기록 시각 등에 권장
📖 8.4.11 Date and Time Data Types, 각 타입 설명 부분
❌ 정정사항
- “TIMESTAMP 쿼리는 캐시되지만 DATETIME은 캐시되지 않는다”
→ MySQL 매뉴얼에 언급 없음. Query Cache는 MySQL 8.0에서 제거되었고, 타입별 캐시 차별은 공식 문서 근거 없음.
📖 8.10.3 The Query Cache (Note: Removed in MySQL 8.0) - “DATETIME은 8바이트”
→ 구버전 설명. 현재는 공식 문서 기준 5 bytes (+ fractional seconds 0~3).
📖 11.7 Data Type Storage Requirements
✅ 최종 요약:
- 범위: TIMESTAMP(1970~2038) vs DATETIME(1000~9999)
- 저장 크기: TIMESTAMP 4+fsp vs DATETIME 5+fsp
- 타임존: TIMESTAMP 변환 O vs DATETIME 변환 X
- 자동값: 둘 다 DEFAULT/ON UPDATE 지원 (MySQL 5.6.5+)
- 캐시 차이: 공식 문서 근거 없음 (블로그 잘못된 설명)
- created_at / updated_at: DATETIME 권장 (과거/미래 유지, 범위 안전)
- last_accessed_at: TIMESTAMP도 가능 (로그 성격, 글로벌 서비스 변환 필요시)
참조
'SQL' 카테고리의 다른 글
| [MySQL] 비율별로 등급나누기 NTILE, PERCENT_RANK (0) | 2024.08.23 |
|---|---|
| [MYSQL] 프로그래머스: 재귀문 (recursive) 사용하기 + 예제 (0) | 2024.08.06 |
| [MYSQL] 프로그래머스: 흉부외과 또는 일반외과 의사 목록 출력하기 (0) | 2023.03.29 |
| [MYSQL] 프로그래머스: 12세 이하인 여자 환자 목록 출력하기 (0) | 2023.03.29 |