2011-11-24 3 views
2

어쨌든이 성능을 향상시킬 수 있습니까?간단한 쿼리 느린

SELECT fdyofmth, SUM(total_restored) AS total_restored 
FROM sum_restored 
WHERE fdyofmth BETWEEN '2010-11-01' AND '2011-11-01' 
GROUP BY fdyofmth 
ORDER BY fdyofmth DESC 

결과가 3 초 걸립니다. 나는 실제로 두 배 느린 만든 fdyofmth의 KEY를 넣어 시도

+----+-------------+--------------+------+---------------+------+---------+------+--------+----------------------------------------------+ 
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra          | 
+----+-------------+--------------+------+---------------+------+---------+------+--------+----------------------------------------------+ 
| 1 | SIMPLE  | sum_restored | ALL | NULL   | NULL | NULL | NULL | 752660 | Using where; Using temporary; Using filesort | 
+----+-------------+--------------+------+---------------+------+---------+------+--------+----------------------------------------------+ 
1 row in set 

-

+------------+----------------+ 
| fdyofmth | total_restored | 
+------------+----------------+ 
| 2011-11-01 |   39793 | 
| 2011-10-01 |   52367 | 
| 2011-09-01 |   52141 | 
| 2011-08-01 |   56515 | 
| 2011-07-01 |   54668 | 
| 2011-06-01 |   54874 | 
| 2011-05-01 |   60025 | 
| 2011-04-01 |   60005 | 
| 2011-03-01 |   63856 | 
| 2011-02-01 |   64472 | 
| 2011-01-01 |   58943 | 
| 2010-12-01 |   57005 | 
| 2010-11-01 |   55731 | 
+------------+----------------+ 

는 결과를 설명한다.

도움을 주시면 감사하겠습니다.

감사합니다.

+0

필드 유형은 무엇입니까? CREATE (붙여 넣기)를 붙여 주실 수 있습니까? 이 테이블에 몇 개의 레코드가 있습니까? 천천히 얼마나 천천히, 당신은 실행 시간을 붙여 넣을 수 있습니다. –

+0

'fdyofmth'에 대한 색인 (그 자체로)이 도움이 될 것입니다. 하나 있습니까? – wallyk

+0

@NedretRecep 나는 지금 CREATE를 붙여 넣을 수 없지만 필드는 "DATE ​​- fdyofmth"및 "INT - total_restored"입니다.내가 말했던 것처럼 결과를 보여주기 위해 3 초가 걸렸고 fdyofmth에 대한 인덱스는 6 초가 걸렸습니다.이 테이블의 총 행은 설명 플랜 당 752K입니다. 감사. – mybigman

답변

0

이 시도 : 날짜 다음, 동일하지 않습니다

 
SELECT fdyofmth, SUM(total_restored) AS total_restored 
FROM sum_restored 
WHERE fdyofmth >= '2010-11-01' AND fdyofmth <= '2011-12-01' 
GROUP BY fdyofmth 
ORDER BY fdyofmth DESC 

그것이

+0

응답 해 주셔서 감사합니다. 그 결과는 거의 같았습니다. ( – mybigman

0

당신의 EXPLAIN 결과에 따르면, 쿼리가 어떤 인덱스를 사용하지 않는 희망이 도움 합니다.

ALTER TABLE sum_restored ADD INDEX fdyofmth_index (fdyofmth); 

또는 다른 제안 =) : 당신은 fdyofmth에 인덱스 설정해야합니다 나는 당신이, 너무 많은 데이터를 가지고 있기 때문에, 천천히 생각

SELECT 
    SUM (IF(fdyofmth = '2010-11-01', total_restored, NULL)) as `2010-11-01`, 
    SUM (IF(fdyofmth = '2010-12-01', total_restored, NULL)) as `2010-12-01`, 
    SUM (IF(fdyofmth = '2011-01-01', total_restored, NULL)) as `2011-01-01`, 
    SUM (IF(fdyofmth = '2011-02-01', total_restored, NULL)) as `2011-02-01`, 
    SUM (IF(fdyofmth = '2011-03-01', total_restored, NULL)) as `2011-03-01`, 
    SUM (IF(fdyofmth = '2011-04-01', total_restored, NULL)) as `2011-04-01`, 
    SUM (IF(fdyofmth = '2011-05-01', total_restored, NULL)) as `2011-05-01`, 
    SUM (IF(fdyofmth = '2011-06-01', total_restored, NULL)) as `2011-06-01`, 
    SUM (IF(fdyofmth = '2011-07-01', total_restored, NULL)) as `2011-07-01`, 
    SUM (IF(fdyofmth = '2011-08-01', total_restored, NULL)) as `2011-08-01`, 
    SUM (IF(fdyofmth = '2011-09-01', total_restored, NULL)) as `2011-09-01`, 
    SUM (IF(fdyofmth = '2011-10-01', total_restored, NULL)) as `2011-10-01`, 
    SUM (IF(fdyofmth = '2011-11-01', total_restored, NULL)) as `2011-11-01` 
FROM sum_restored; 
+0

더 빠를 것입니까? 인덱스가 있어도 어쨌든 모든 데이터를 처리하고 있습니다. –

+0

@newtover에서 설명한대로 질문 나는 fdyofmth에 색인을 붙였습니다. 그러나 그렇게하는 것은 저를 당혹스럽게 한 3 초에서 6 초까지의 질문을 받았습니다 :( – mybigman

+0

@ james-xu, 필드는 WHERE 조건에서 사용됩니다. 'BETWEEN'의 비교에서 중요한 부분입니다. 그러나 당신은 옳은 것처럼 보입니다. 조건은 매우 넓고 너무 많은 데이터입니다. – newtover

1

을하고 SQL은 통과한다 모든 데이터 (은 전체 데이터 세트에서 하나를 선택하지 않습니다.)이므로 index은 여기서 도움이 될 수 없습니다. 각 달에 대한 결과를 검색 할 수 @newtover

  • 을 사용하여 12 개 스레드를 제안

    1. 인덱스를 추가

      내가 제안 옵션은 사용 병렬입니다.

    심지어 간단한

  • :

    단지 미리 계산 다른 테이블에 결과를 때 쿼리, 해당 테이블에서 쿼리.

    +0

    저는 사전 컴퓨팅의 아이디어를 좋아합니다. 값을 저장하고 다른 테이블에 저장하지만 문제는 그 날짜가 사용자 선택에 따라 임의적 인 것입니다. 또한 테이블의 다른 열에도 필터를 적용하여 결과에 영향을 미칠 수 있습니다. 그게 가능할 것 같니? 저를 놀라게하는 것은 오라클 DB에 대한 동일한 쿼리가 약 500ms라는 것입니다 : -/이상한 무엇입니까? – mybigman

    +0

    튜닝 할 수있는 설정이 있습니다. 예를 들어, ** innodb **를 사용하는 경우, 가장 중요한 설정은'innodb_buffer_pool_size' 일 수 있습니다. 대부분 당신의 메모리를 할당해야합니다. –

    0

    외부 쿼리 변경 사항을 해결해야합니다.

    • 테이블 많은의 크기를 줄일 각각 지난 달
    • 에 대한 준비가 계산 된 요약을 유지하기 위해 다른 테이블을 만듭니다. 매년 또는 매월 또는 행마다 다른 표가 변경됩니다.