<./>.dev./hood

| MySQL에서 DATETIME 형식의 데이터를 고속으로 검색하기

MYSQL의 UNIX_TIMESTAMP 함수를 이용 

INT 형으로 저장하여 DATETIME 형식보다 3 배 ~ 4 배(?) 고속화가능


Memo

1.DATETIME 형의 경우

-----------------------------------------------------

SELECT * FROM test_datetime

WHERE date between '2013-01-01' and '2013-06-30';

처리 결과 ( 5.20 sec )


2.INT 형의 경우

-----------------------------------------------------

SELECT * FROM test_unixtime

WHERE date_unixtime between 1356966000 and 1372518000;

처리 결과 ( 1.64 sec )



##  INT 형식으로 준 쿼리 조건이 데이터 검색 속도가 압도적으로 빠른 결과. ##



////////////////////////////////////////////



(reg_date는 datetime형이고, 인덱스가 걸려있다고 가정한다.)

SELECT *
FROM    Test
WHERE   date_format(reg_date, '%Y-%m-%d') BETWEEN '2013-01-01' AND '2013-01-31';

SELECT *
FROM    Test
WHERE   date(reg_date) BETWEEN '2013-01-01' AND '2013-01-31';



위와 같이 쿼리를 하면 데이터가 늘어날수록 부하가 걸리는 쿼리가 된다.

- WHERE절의 왼쪽은 가공하지 않는다. (인덱스를 타지 않음)
- BETWEEN 절도 함수이므로 함수는 되도록 쓰지 않는다.


날짜를 검색할 때 올바른 검색방법은 아래와 같다.

SELECT *
FROM    Test
WHERE reg_date >= '2013-01-01'
AND     reg_date < '2013-02-01'




//////////////////////////////////////////////




[1] WHERE절 왼쪽 가공

SELECT *
FROM Test
WHERE date(reg_date) BETWEEN \'2013-01-01\' AND \'2013-01-31\';

<WHERE절의 왼쪽은 가공하지 않는다. (인덱스를 타지 않음)>



select sql_no_cache count(*) from sbtest where id>=0 and id<=83389129;
select sql_no_cache count(*) from sbtest where id between 0 and 83389129;



[x BETWEEN $1 AND $2]= 평균 4.118333 초가 소요
[x>=$1 AND x<=$2] = 평균 3.442857 초가 소요

두 개 쿼리의 실행계획 동일. 모든 데이터가 Buffer pool 에 cache(Warming up)된
상태에서 실행했기 때문에 상태는 거의 동일했다고 보여집니다.

이 두 조건의 처리 속도가 다르게 나왔다는 것은
[x BETWEEN $1 AND $2] 방식의 비교가 [x>=$1 AND x<=$2] 방식의 비교보다
CPU cycle을 적게 소모했다는 결과로 보여집니다.



참고 URL -

http://tokyogoose.tistory.com/304

http://egloos.zum.com/tiger5net/v/5751776