Open-Closed Principle

MySQL 현재 시각 조회(NOW, SYSDATE) 본문

Programming/MySQL

MySQL 현재 시각 조회(NOW, SYSDATE)

대박플머 2022. 7. 5. 08:29

두 함수 모두 현재의 시간을 반환하는 함수로서 같은 기능을 수행한다. 하지만 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에서는 같은 값을 갖게 된다.