2014-11-12 3 views
0

내가 5 백만 행 데이터베이스 테이블을 가지고, 나는 실행하고 있습니다 :이 날짜 범위 쿼리가 너무 느린 이유는 무엇입니까?

id (int pk auto inc) 
actor (varchar) 
action (enum) 
target (varchar) 
is_successful (tinyint) 
datetime_created (datetime) 

인덱스 :

select 
    * 
from 
    tbl 
where 
    datetime_created 
between 
    '2014-10-01 00:00:00' and 
    '2014-10-31 23:59:59' 

그것은 428k 결과

TBL에 열을 반환 54 초 걸렸습니다 :

datetime_created (datetime_created, action, target, is_successful) 

개선 방법에 대한 의견이 있으십니까?

편집 :

은 EXPLAIN 결과 :

select_type: simple 
type: range 
possible keys 
datetime_created 
key: datetime_created 
key_len: 8 
ref: null 
rows: 359569 
extra: using index condition 
+0

접두사는 쿼리 전에 수행하고 무엇을하고 있는지 확인 – Khanna111

+0

설명 : select_type : 단순형, 유형 : 범위, 가능한 키 : datetime_created, key : datetime_created, key_len : 8, ref : null, rows : 359569, extra : 인덱스 사용 조건 – john

+0

설명은 인덱스를 사용하고 있지만 성능은 여전히 ​​여전히 좋지 않음을 나타냅니다. – john

답변

0

428k 행의 많은 한 번에 작동하는 것입니다. 날짜에 대한 인덱스가 있더라도 엔진은 여전히 ​​높은 값과 낮은 값 사이에서 테이블을 스캔해야합니다. 가능한 경우 작은 덩어리로 데이터를 읽고 결과를 좁히는 여러 쿼리를 제안합니다.

예. 작업 범위 열거 필터를 날짜 범위와 함께 추가하면 훨씬 빠른 결과를 얻을 수 있습니다. 5 개의 열거 형이 있다고 가정하면 각 열거 형 열거에 대해 5 개의 쿼리를 실행합니다. 인덱싱 된 조건이 많을수록 쿼리가 더 잘 수행됩니다.

대용량 레코드 집합을 처리 할 앱에서 사용하는 경우에도 고려하십시오. 한 번에 428k 개의 결과로 작업해야합니까?

+0

그것은 본질적으로 '로그'로 사용하는 데이터베이스 테이블입니다. 다른 작업 유형 등을 기반으로 몇 가지 계산을 수행해야합니다. – john

+0

그래서 집계를 수행해야합니다. 그룹 활동 진술로 그룹에 추가하면 색인을 더 잘 활용할 수 있습니다. – Avner

관련 문제