두 함수 모두 현재의 시간을 반환하는 함수로서 같은 기능을 수행한다. 하지만 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에서는 같은 값을 갖게 된다.
'DataBase' 카테고리의 다른 글
MySQL에서 B-Tree 인덱스란 무엇인가요? (0) | 2024.08.12 |
---|---|
Redis를 이용한 트랜잭션 처리와 분산 락 구현 (0) | 2024.07.16 |
MYSQL 사용자 계정 추가 (비밀번호관리) (0) | 2022.06.28 |
MySQL 사용자 계정 추가 (인증플러그인) (0) | 2022.06.27 |
MySQL 인덱스 스캔(Index Scan) (0) | 2022.05.11 |