개발에서 반영요청한 테이블 스키마를 보던 중에 datetime과 timestamp를 각각 선언해서 쓴 경우가 있어서 둘의 차이를 분석해보고 반영여부를 검토했다.
일단 구글링..
1. 날짜 및 시간 타입
1) DATETIME
이 타입은 매우 큰 범위의 값, 즉 1001년부터 9999년까지의 값을 1초 단위로 저장할 수 있다. DATETIME 은 날짜와 시각을 YYYYMMDDHHMMSS` 포맷의 정수 값으로 묶는데, 시간대에는 영향을 받지 않는다. DATETIME 은 8 바이트의 저장 공간을 사용한다.
2) TIMESTAMP
이름이 암시하듯, TIMESTAMP 타입은 1970년 1월 1일 자정(그리니치 평균시)을 기준으로 몇초가 지났는지를 저장하며, Unix 타임스탬프와 동일하다. TIMESTAMP 는 저장 공간을 4 바이트만 사용하므로 값의 범위가 DATETIME 보다 훨씬 작고, 1970년부터 2038년 사이의 값만을 저장할 수 있다.
MySQL 에서는 FROM_UNIXTIME(), UNIX_TIMESTAMP()` 같은 함수를 제공하는데 이 함수를 이용하면 Unix 타임스탬프를 날짜로 바꾸거나 그 날짜를 Unix 타임스탬프로 바꿀 수 있다.
TIMESTAMP 에 출력되는 값은 시간대에 따라 다르다. MySQL 서버, 운영체제, 클라이언트 연결은 모두 시간대 설정이 있다.
또한 TIMESTAMP 에는 DATETIME 에는 없는 특별한 특성들이 있다. 기본적으로 TIMESTAMP 컬럼에 값을 지정하지 않은 채로 행을 추가하면 첫 번째 TIMESTAMP 컬럼에 현재 시각을 넣는다.
또, UPDATE 실행 시 TIMESTAMP 값을 명시적으로 할당하지 않고 실행하면 TIMESTAMP 컬럼의 값이 자동으로 업데이트 된다. (즉, TIMESTAMP 는 기본적으로 NOT NULL)
2. 표로 정리
timestamp | datetime | |
날짜 범위 | 1970-01-01 09:00:00 ~ 2037-12-31 23:59:59 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
저장형태 | 숫자형 | 문자형 |
파일사이즈 | 4byte | 8byte |
자동입력? | O (defalut 값을 주면 굳이now() 컬럼 값 주지 않아도 자동입력됨) |
x |
3. 테스트
컬럼 스키마 선언
`REG_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시'
위처럼 선언하면 insert into 할 때 now() 안써도 된다는데 확인해본다.
음.. 잘된다.
보통은 datetime 이라면 insert into 테이블 ( SEQ, REG_DATE) values ( SEQ, now() );
이렇게 썼겠지만
타임스템프 default 옵션을 쓰면 insert into 테이블 ( SEQ, REG_DATE) values ( SEQ );
만 쓰면 자동으로 현재시간을 테이블에 넣는다.
4. timestamp 쓸것인가 말것인가
개발쪽에서 알고 기존 테이블 복붙해서 쓴 것이고 제대로 알고 쓴 것이 아닌 것으로 확인했고,
소스도 이미 now()를 넣는 것으로 컴파일해서 올렸다고 한다..
그래서 소스재배포 없이 그냥 DB 스키마를 datetime not null로 변경해서 반영했다.
DB 서버의 UTC 값을 가져와서 해외로 이전할 때는 문제 될 거 같긴 하지만
성능으로 보자면 파일사이즈(4byte)가 datetime 의 절반이라
2038년까지는 timestamp를 쓰는 게 좋을 거 같긴하다..^^
'RDB > mysql' 카테고리의 다른 글
slave online hot backup 구축 (0) | 2020.04.11 |
---|---|
[튜닝] mysql function 성능 이슈 (0) | 2020.04.08 |
[error] mysqldump: Got errno 28 on write (0) | 2020.04.02 |
SSD 파티션 튜닝 2 (0) | 2020.03.31 |
SSD 파티션 튜닝 1 (0) | 2020.03.26 |