MySQL에서 DATETIME 형식 데이터 고속 검색 방법
| 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
'DB > MySQL - MariaDB' 카테고리의 다른 글
Mysql 데이터 타입 변경 및 추가 명령어. (0) | 2017.03.25 |
---|---|
inner join 과 left join 함께 쓰기 (0) | 2017.03.11 |
Mysql 에서 실행계획을 분석하는 방법 (0) | 2017.03.08 |
쿼리문 정규식 _ 내 해당하는 값 찾기 (0) | 2017.02.20 |
select 구문와 count 구문을 left join 으로 동시에 출력 (0) | 2016.01.03 |