2014-02-17 4 views
0

다음 표 구조가 있습니다. 인덱스가있는 mysql 쿼리가 느림

SQL FIDDLE

는 지금은

SELECT DATE(date),SUM(amount) FROM my_table WHERE type!=5 
AND date BETWEEN '2014-01-01' AND '2014-01-04' 
GROUP BY DATE(date) ORDER BY date DESC 

이 쿼리는 행의 작은 번호가 내 개발 데이터베이스에 노력하고 다음 쿼리를 사용하고 있습니다. 그러나 이것은 유능한 데이터베이스에서는 매우 느리고 1 주일 동안 값을 표시하는 데 거의 9 초가 걸립니다. 나는 날짜와 타입에 대한 인덱스를 가지고 있으며, 나의 explain 질의는 타입을 모두 보여주고있다. prod DB에는 거의 700000 개의 항목이 있습니다.

어떻게이 쿼리를 더 최적화 할 수 있습니까 ??

답변

0

쿼리에서 DATE(date)을 사용하여 사용중인 식의 datetime 부분을 추출합니다. 그러나 DDL에서 date은 이미 datetime으로 정의되어 있습니다. 실행 중에 오버 헤드가 발생할 수 있습니다. DDL이 올바른 데이터 유형으로 올바르게 정의 된 경우 더 좋은 결과를 얻기 위해 DATE(date)을 피할 수 있습니다.

또 다른 방법은 SQL 최적화 프로그램이 열에 적용된 색인을 사용하도록하는 것입니다. 당신은 쿼리를 수정하여이 작업을 수행 할 수 있습니다 :

SELECT DATE(date),SUM(amount) FROM my_table 
USE INDEX(type,date) 
WHERE type!=5 
AND date BETWEEN '2014-01-01' AND '2014-01-04' 
GROUP BY DATE(date) ORDER BY date DESC; 

당신은 http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

+0

오 이런 식으로하지 않습니다. 날짜 부분 만 가져 오는 데 사용하고 있습니다. 그렇지 않으면 GROUP BY가 일일 것을 표시하는 대신 개별 합계를 표시합니다. –

+0

GROUP BY에서 제거 할 수 없다는 것을 알고 있습니다. 그러나 테이블에서 날짜를 선택하는 동안 날짜 부분 만 필요합니까? – Neels

+0

게시 된 새 쿼리를 확인하십시오. 이렇게하면 더 나은 결과를 얻을 수 있습니다. – Neels

1

에서 사용 INDEX에 대한 자세한 내용을보실 수 있습니다 나는 당신이 인덱스가 쿼리에 참조 할 수있는 방법을 찾기 위해 노력하고있다 생각합니다. 여기 최적화에 의해 그룹에 대한 MySQL의 문서 회담 :

느슨한 스캔이 발생하기 위해 적용해야하는지에 대한 점의 숫자가 있습니다

http://dev.mysql.com/doc/refman/5.5/en/group-by-optimization.html

. 단지 MIN과 MAX는 당신이 추가 다음 인덱스 찾을 수 있습니다 사용되어야하는 문서 상태 일 때 :

ADD INDEX `BTREE_OPT` (`type`, `date`, `amount`) USING BTREE 

그리고 검사를 설명 당신이 인덱스 사용의 새로운 포함 참조 확장 :

mysql> EXPLAIN EXTENDED SELECT DATE(date), SUM(amount) FROM my_table WHERE TYPE !=5 AND date BETWEEN '2014-01-01' AND '2014-01-04' GROUP BY DATE(date) ORDER BY date DESC \G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: my_table 
     type: range 
possible_keys: date,type,BTREE_OPT 
      key: BTREE_OPT 
     key_len: 4 
      ref: NULL 
     rows: 11 
    filtered: 100.00 
     Extra: Using where; Using index; Using temporary; Using filesort 
1 row in set, 1 warning (0.00 sec) 

쿼리 속도가 빨라질 수 있습니다.