MySQL NOW()와 SYSDATE()의 차이

Last Updated on 1월 22, 2021 by 태랑(정현호)



MySQL 에서는 현재 시각을 조회하는 함수로 NOW() 와 SYSDATE 함수가 있으며 현재의 시간을 반환하는 같은 기능을 수행합니다

SELECT NOW();
SELECT SYSDATE();

다만 2개의 시간 조회 함수는 사용하기에 따라 시간 다른 결과와 다른 성능적 요건이 발생되게 됩니다


1. 시간 결과 차이

먼저 SYSDATE() 는 같은 SQL 에서도 조회 시점에 따라서 결과가 달라지게 됩니다.

mysql> SELECT NOW(),SLEEP(5),NOW();
+----------+----------+----------+
| NOW()    | SLEEP(5) | NOW()    |
+----------+----------+----------+
| 12:37:02 |        0 | 12:37:02 |
+----------+----------+----------+

mysql> SELECT SYSDATE(),SLEEP(5),SYSDATE();
+-----------+----------+----------+
| SYSDATE() | SLEEP(5) | SYSDATE()|
+-----------+----------+----------+
| 12:37:05  |        0 | 12:37:10 |
+-----------+----------+----------+

* 가로 사이즈를 줄이기 위해서 날짜는 제외하였습니다

위와 같이 5초의 대기 한 후 각각 조회를 해보면 NOW() 는 같은 SQL 문장에서 같은 시간을 반환 하지만 SYSDATE() 는 대기한 5초 동안의 차이가 발생하는 것을 확인 할 수 있습니다
그래서 SYSDATE() 아래의 잠재적인 문제를 내재되어 있습니다.

- SYSDATE() 함수를 사용한 SQL DML 수행시 Replication 환경에서 Slave 에 정상적인 복제가 이루어 지지 않게 될수도 있음

- SYSDATE() 는 NOW() 에 비해 인덱스를 효율적으로 사용하지 못할 수 있음


2. 인덱스 사용시 차이

2-1 샘플 테이블 과 플랜 조회 쿼리

-- 샘플 테이블 생성
CREATE TABLE tb_test (
 col1 int NOT NULL AUTO_INCREMENT,
  col2 varchar(20) DEFAULT NULL,
  col3 int  DEFAULT NULL,
  regdt datetime NOT NULL,
  PRIMARY KEY (col1),
  KEY ix_1(col3, regdt)
) ENGINE=InnoDB;

-- NOW() 사용
explain
SELECT * 
  from tb_test 
    where col3=10
    and regdt>now();

-- SYSDATE() 사용
explain
SELECT * 
  from tb_test 
    where col3=10 
    and regdt>sysdate();



2-2 플랜 차이 비교

select * from tb_test where col3=10 and regdt>now();
+--+--------+-------+------+---------+
|id|sel_type|table  | key  | key_len |
+--+--------+-------+------+---------+
| 1|SIMPLE  |tb_test| ix_1 | 10      |
+--+--------+-------+------+---------+

select * from tb_test where  col3=10 and regdt>sysdate();
+--+--------+-------+------+---------+
|id|sel_type|table  | key  | key_len |
+--+--------+-------+------+---------+
| 1|SIMPLE  |tb_test| ix_1 | 5       |
+--+--------+-------+------+---------+

* 가로 사이즈를 줄이기 위해서 편집되어 있습니다.


2-3 2개 함수의  차이점 

SYSDATE() 함수는 호출될 때마다 다른 값을 반환하게 됨에 따라 사실상 상수화 되어 처리가 되지 못하는 부분이 있습니다 그래서 위와 같은 쿼리 에서 아래 SYSDATE() 함수를 사용하여 WHERE 절을 비교 할때, 매번 비교시 마다 SYSDATE() 를 호출해야 합니다

또한 위의 예제에서 결합 인덱스 로 구성된 col3+regdt 컬럼 중 인덱스 스캔시 2개의 컬럼을 모두 사용 하였는지 1개의 컬럼만 사용되었는지에 따라 플랜상 key_len 수치 다른점을 확인 할 수 있습니다



3. conclusion 

이와 같이 2개의 시간 반환 함수는 사용에 따라서 차이를 보이게 됩니다.

1개의 트랜잭션 내에 다수의 쿼리가 포함되어 있고 중간중간에 시간을 조회하거나 조회된 값으로 데이터 입력 또는 변경시 등 처음시작과 끝이 동일 해야 한다면 NOW() 를 사용해야 할것 입니다 
그리고 의도하여 중간 중간 조회시의 시간을 확인이나 조회 시점의 시간이 필요하다면 SYSDATE() 를 사용 해야 할것 입니다

SYSDATE() 를 NOW() 함수처럼 처리 하도록 설정 할 수 있습니다. my.cnf 설정 파일에 sysdate-is-now 를 추가 하면 SYSDATE() 도 NOW() 와 같은형태로 수행되게 됩니다


Ref Book : Real MySQL[Iink]


연관된 다른 글

 

 

 

 

 

 

답글 남기기