Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[20230220] MySQL NOW() vs SYSDATE() #273

Open
JuHyun419 opened this issue Feb 20, 2023 · 0 comments
Open

[20230220] MySQL NOW() vs SYSDATE() #273

JuHyun419 opened this issue Feb 20, 2023 · 0 comments
Labels

Comments

@JuHyun419
Copy link
Owner

JuHyun419 commented Feb 20, 2023

NOW()와 SYSDATE()의 차이점

  • 두 함수 모두 현재 시스템 날짜 및 시간을 반환하는 함수이지만, 항상 동일한가 아닌가의 차이점이 존재함
  • NOW(): 하나의 SQL에서 모든 NOW() 함수는 동일한 값을 가짐
  • SYSDATE(): 하나의 SQL내에서도 호출 시점에 따라 결과값이 다라짐
SELECT NOW(), SLEEP(2), NOW();
SELECT SYSDATE(), SLEEP(2), SYSDATE();

image

image

그럼 뭘 써야 할까?

  • NOW()를 쓰는게 좋은데, SYSDATE()는 아래와 같은 문제점을 가질 수 있다.
    • 레플리카 서버에 안정적으로 복제되지 못한다.
    • 인덱스를 효율적으로 사용하지 못한다.

간단한 예제를 살펴보자

  • salaries 테이블, index는 PK(emp_no, from_date), ix_salary(salary)
    image
  1. NOW()
EXPLAIN 
SELECT emp_no, salary, from_date, to_date
FROM salaries
WHERE emp_no = 10001 AND from_date > NOW();

image

  1. SYSDATE()
EXPLAIN 
SELECT emp_no, salary, from_date, to_date
FROM salaries
WHERE emp_no = 10001 AND from_date > SYSDATE();

image

  • NOW()는 emp_no와 from_date 칼럼 모두 인덱스를 적절히 사용했으나 SYSDATE()는 emp_no 칼럼만 인덱스를 사용
  • SYSDAET()는 인덱스를 스캔할 때도 매번 비교되는 레코드마다 함수를 실행해야 함

코드에서 이미 SYSDATE() 함수를 사용하고 있다면?

  • MySQL 설정 파일(my.cnf, my.ini)에 sysdate-is-now 시스템 변수를 추가하여 활성화를 한다.
    • sysdate-is-now: SYSDATE() 함수도 NOW() 함수처럼 동작

참고

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant