MySQL 에서 시간 을 저장 하 는 가장 좋 은 실천 지침
평소에 개발 할 때 특정한 기록 의 생 성 시간 과 수정 시간 을 기록 하 는 데 시간 이 자주 필요 하 다.데이터베이스 에 시간 을 저장 하 는 방식 은 여러 가지 가 있다.예 를 들 어 MySQL 자체 가 날짜 유형 을 제공 했다.예 를 들 어 DATETIME,TIMESTAMEP 등 이다.우 리 는 시간 스탬프 를 INT 형식 으로 직접 저장 할 수도 있 고 시간 을 문자열 형식 으로 직접 저장 하 는 사람 도 있다.
그렇다면 도대체 어떤 저장 시간 방식 이 더 좋 을 까?
문자열 저장 시간 형식 을 사용 하지 마 십시오.
초보 자가 범 하기 쉬 운 오류 로 필드 를 바로 VARCHAR 형식 으로 설정 해'2021-01-01 00:00:00'과 같은 문자열 을 저장 하기 쉽다.물론 이렇게 하 는 장점 은 비교적 간단 하고 손 이 빠르다 는 것 이다.
그러나 이렇게 하 는 것 을 극력 추천 하지 않 는 다.왜냐하면 이렇게 하 는 것 은 두 가지 큰 문제 가 있 기 때문이다.
MySQL 데이터베이스 에서 흔히 볼 수 있 는 날짜 유형 은 YEAR,DATE,TIME,DATETIME,TIMESTAMEP 이다.일반적으로 날 짜 를 초 까지 정확하게 해 야 하기 때문에 그 중에서 가장 적합 한 것 은 DATETIME,TIMESTAMEP 이다.
DATETIME
DATETIME 이 데이터베이스 에 저장 하 는 형식 은 YYYY-MM-DD HH:MM:SS 로 8 개의 바이트 가 고정 되 어 있 습 니 다.
MySQL 5.6 버 전부터 DATETIME 형식 은 밀리초,DATETIME(N)의 N 은 밀리초 정밀 도 를 나 타 냅 니 다.예 를 들 어 DATETIME(6)은 6 자리 의 밀리초 값 을 저장 할 수 있다 는 뜻 이다.
TIMESTAMEP
TIMESTAMP 가 실제 저장 한 내용 은'1970-01-01 00:00:00'부터 현재까지 밀리초 입 니 다.MySQL 에 서 는 타 입 TIMESTAMP 가 4 개의 바이트 를 차지 하기 때문에'2038-01-19 03:14:07'까지 만 저장 할 수 있 습 니 다.
MySQL 5.6 버 전부터 타 입 TIMESTAMP 도 밀리초 간 지원 된다.DATETIME 와 달리 밀리초 가 있 을 경우 타 입 TIMESTAMP 는 7 개의 바이트 가 차지 하지만,DATETIME 은 밀리초 정 보 를 저장 하 든 말 든 8 개의 바이트 가 차지 합 니 다.
타 입 TIMESTAMP 의 가장 큰 장점 은 시간 대 속성 을 가 질 수 있다 는 것 입 니 다.본질 적 으로 밀리초 에서 바 뀌 었 기 때 문 입 니 다.만약 당신 의 업무 가 서로 다른 국가 시간 대 에 대응 해 야 한다 면,타 입 TIMESTAMP 는 좋 은 선택 입 니 다.예 를 들 어 뉴스 와 같은 업 무 는 보통 사용자 가 이 뉴스 를 발표 할 때 해당 하 는 자신의 국가 시간 을 알 고 싶 으 면 TIMESTAMP 는 선택 이다.Timestamp 형식 필드 의 값 은 서버 시간 대 에 따라 달라 집 니 다.자동 으로 해당 시간 으로 환산 합 니 다.쉽게 말 하면 시간 대 에 따라 같은 필드 를 기록 하 는 값 이 다 를 수 있 습 니 다.
TIMESTAMP 의 성능 문제
TIMESTAMP 에는 잠재 적 인 성능 문제 도 있다.
밀리초 에서 타 입 TIMESTAMP 로 전환 하 는 데 필요 한 CPU 명령 이 많 지 않 지만 직접적인 성능 문 제 는 가 져 오지 않 습 니 다.그러나 기본 운영 체제 시간 대 를 사용 하면 시간 대 를 통 해 시간 을 계산 할 때마다 운영 체제 바 텀 시스템 함수 를 호출 합 니 다.tz_convert(),이 함 수 는 이 운영 체제 시간 대가 수정 되 지 않도록 추가 잠 금 작업 이 필요 합 니 다.따라서 대규모 동시 방문 시 핫 이 슈 자원 경쟁 으로 인해 두 가지 문제 가 발생 할 수 있다.
[mysqld]
time_zone = "+08:00"
이 두 가지 데이터 유형의 장단 점 을 간단하게 정리 하 자.DATETIME 에 저 장 된 시간 상한 선 이 없고 TIMESTAMP 에 저 장 된 시간 상한 선 은'2038-01-19 03:14:07'까지 만 가능 합 니 다
많은 경우 에 우 리 는 int 나 bigint 형식의 수치,즉 시간 스탬프 를 사용 하여 시간 을 표시 합 니 다.
이러한 저장 방식 은 Timestamp 유형의 장점 을 가지 고 이 를 사용 하여 날짜 정렬 과 대비 등 작업 을 하 는 효율 이 더욱 높 고 시스템 간 에 도 편리 하 다.왜냐하면 저 장 된 수치 일 뿐이다.단점 도 뚜렷 하 다.바로 데이터 의 가 독성 이 너무 떨 어 지기 때문에 구체 적 인 시간 을 직관 적 으로 볼 수 없다 는 것 이다.
시간 대별 데 이 터 를 볼 필요 가 있다 면
select * from t where created_at > UNIX_TIMESTAMP('2021-01-01 00:00:00');
DATETIME vs TIMESTAMP vs INT,어떻게 선택 하나 요?모든 방식 은 각자 의 장점 을 가지 고 다음 에 이 세 가지 방식 에 대해 간단 한 대 비 를 한다.
날짜 종류
공간 을 점용 하 다
날짜 형식
날짜 범위
질문
DATETIME
8 바이트
YYYY-MM-DD HH:MM:SS
1000-01-01 00:00:00 ~9999-12-31 23:59:59
예.
TIMESTAMP
4 바이트
YYYY-MM-DD HH:MM:SS
1970-01-01 00:00:00 ~2038-01-19 03:14:07
아니.
INT
4 바이트
풀 디지털 타임 스탬프
1000-01-01 00:00:01 이후 의 시간
아니.
TIMESTAMP 는 INT 와 본질 이 같 지만 이에 비해 INT 는 개발 에 우호 적 이지 만 DBA 및 데이터 분석 요원 에 게 우호 적 이지 않 고 가 독성 이 떨어진다.그래서'고성능 MySQL'의 저자 가 추천 합 니 다. TIMESTAMP 의 이 유 는 시간 이 더 직관 적 이라는 것 을 나타 내 는 수치 때문이다.다음은 원문 입 니 다.
시간 대 문 제 는 전단 이나 서비스 에서 한 번 전환 할 수 있 으 며 반드시 데이터 베이스 에서 해결 해 야 하 는 것 은 아니다.
총결산
본 고 는 몇 가지 가장 자주 사용 하 는 저장 시간의 방식 을 비교 하 였 는데,내 가 가장 추천 하 는 것 은 역시 DATETIME 이다.이 유 는 다음 과 같다.
TIMESTAMP 는 수치 형 타임 스탬프 보다 가 독성 이 더 좋 습 니 다DATETIME 의 저장 상한 선 은 9999-12-31 23:59:59 이 며,TIMESTAMP 를 사용 할 경우 2038 년 에 해결 방안 을 고려 해 야 한다DATETIME 은 시간 대 전환 이 필요 없 기 때문에 TIMESTAMP 보다 성능 이 좋 습 니 다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.