일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- C#
- Loose Index Scan
- Index Range Scan
- jQuery
- 큐 연결리스트
- 배열 스택
- javascript prototype
- 연결 리스트
- 이중 연결 리스트
- 포인터
- Index Skip Scan
- 스택 배열
- c언어 스택 배열
- javascript 생성자
- 생성자
- npm Option
- pattern
- 스택
- 생성자 new
- 배열
- 연결리스트
- 연동
- 추상적 자료 구조
- Index Full Scan
- 자료구조
- new 사용법
- javascript this
- 확장 엘리먼트
- javascript new
- access
- Today
- Total
Open-Closed Principle
MySQL 현재 시각 조회(NOW, SYSDATE) 본문
두 함수 모두 현재의 시간을 반환하는 함수로서 같은 기능을 수행한다. 하지만 NOW()와 SYSDATE() 함수는 작동 방식에서 큰 차이가 있다.
하나의 SQL에서 모든 NOW() 함수는 같은 값을 가지지만 SYSDATE() 함수는 하나의 SQL 내에서 호출되는 시점에 따라 결괏값이 달라진다.
CASE 1. NOW()
CASE 2. SYSDATE()
NOW() 함수를 사용한 첫 번째 예제에서는 두 번의 NOW() 함수 결과가 같은 값을 반환했다. 하지만 두 번째 예제에서 사용된 SYSDATE() 함수는 SLEEP() 함수의 대기 시간인 2초 동안의 차이가 있음을 알 수 있다.
SYSDATE() 함수는 이러한 특성 탓에 두 가지 큰 잠재적인 문제가 있다.
- 첫 번째로는 SYSDATE() 함수가 사용된 SQL은 레플리카 서버에서 안정적으로 복제되지 못한다.
- 두 번째로는 SYSDATE() 함수와 비교되는 칼럼은 인덱스를 효율적으로 사용하지 못한다.
SYSDATE() 함수는 이 함수가 호출될 때마다 다른 값을 반환하므로 사실은 상수가 아니다. 그래서 인덱스를 스캔할 때도 매번 비교되는 레코드마다 함수를 실행해야 한다. 하지만 NOW() 함수는 쿼리가 실행되는 시점에서 실행되고 값을 할당받아서 그 값을 SQL 문자의 모든 부분에서 사용하기 때문에 쿼리가 1시간 동안 실행되더라도 실행되는 위치나 시점에 관계없이 항상 같은 값을 보장 할 수 있다.
꼭 필요한 때가 아니라면 SYSDATE() 함ㅅ를 사용하지 않는 편이 좋겠지만, 이미 SYSDATE() 함수를 사용하고 있다면 MySQL 서버의 설정 파일(my.cnf나 my.ini 파일)에 sysdate-is-now 시스템 변수를 넣어서 활성화하는 것이 이 같은 문제점을 제거하는 빠른 해결책이다. sysdate-is-now가 설정되면 SYSDATE() 함수도 NOW() 함수와 같이 함수의 호출 시점에 관계없이 하나의 SQL에서는 같은 값을 갖게 된다.
'Programming > MySQL' 카테고리의 다른 글
MYSQL 사용자 계정 추가 (비밀번호관리) (0) | 2022.06.28 |
---|---|
MySQL 사용자 계정 추가 (인증플러그인) (0) | 2022.06.27 |
MySQL 인덱스 스캔(Index Scan) (0) | 2022.05.11 |