2016-11-02 4 views
0

사이에 내 쿼리가 약 10 초 실행되고 그건 용납 할 수 없어요.mysql 쿼리 날짜가 큰 테이블

이 속도를 향상시킬 수있는 방법을 찾고 있지만 옵션이 없습니다. 지금부터 30 일 사이의 레코드를 1200 만 행 이상의 테이블에서 찾아야합니다. 나는 또한 시도

SELECT DATE(DATE) AS FDATE, 
     SUM(VIEW_COUNT) AS COUNT, 
     COUNT(IP_ADDRESS) AS CLIENTS 
FROM VIEWS 
WHERE USERID = 'test' 
    AND DATE BETWEEN ADDDATE(CURDATE(), INTERVAL -30 DAY) AND CURDATE() 
GROUP BY FDATE DESC 

,하지만 같은 효과 :

다음 쿼리 쿼리 실행 시간을 감소에서 더 나은 성능을 위해 MySQL의 인덱스를 사용하여 시도 할 수

SELECT DATE(DATE) AS FDATE, 
     SUM(VIEW_COUNT) AS COUNT, 
     COUNT(IP_ADDRESS) AS CLIENTS 
FROM VIEWS 
WHERE USERID = 'test' 
    AND DATE >= (DATE(NOW() - INTERVAL 30 DAY) + INTERVAL 0 SECOND) 
GROUP BY FDATE DESC 
+0

(사용자 ID, 날짜)에 포함 인덱스가 있습니까? – Strawberry

답변

1
+0

"인덱스가 없으면 MySQL은 첫 번째 행으로 시작한 다음 전체 테이블을 통해 관련 행을 찾아야합니다. 테이블이 클수록 더 많은 비용이 듭니다. 모든 데이터를 볼 필요없이 데이터 파일의 중간에 위치 할 위치를 신속하게 결정할 수 있습니다. " –

+0

어디에서 색인을 사용 하시겠습니까? 이 테이블은 다른 테이블에 대한 참조가없는 독립형 테이블이므로 PRIMARY KEY는 ID – Jordy

+0

으로 설정됩니다. 위 텍스트에서 알 수 있듯이 이제 쿼리는 1,200 만 행을 모두 읽고 인덱스를 사용하여 날짜와 날짜를 결정합니다. 당신은 훨씬 빨리 필터링 된 사용자 ID입니다. –