0

동일한 데이터베이스에 프로덕션 설정 및 dev가 설정되어 있습니다. prodution에 8 천만 개의 레코드가있는 테이블이 하나 있는데 dev에 행 수가 적습니다. 두 표 모두 동일한 날짜 색인을가집니다. 그러나 프로덕션 테이블에서 EXPLAIN을 사용할 때 쿼리가 인덱스를 사용하지 않고 모든 행을 스캔하고 있음을 알 수 있습니다. 하지만 그것은 dev 테이블, EXPLAIN은 유형이 '범위'이고 키가 '날짜'이므로 날짜 인덱스를 사용하고 있음을 보여줍니다. 왜 이런 일이 일어나는거야?동일한 테이블이 다른 데이터베이스에서 인덱스를 사용하지 않음

SELECT date(date) as date, SUM(amount) AS points FROM my_table 
WHERE date BETWEEN '2014-04-17' AND '2014-04-23' 
AND status NOT IN (3,4) AND type NOT IN (5) 
GROUP BY date(date) ORDER BY date DESC. 

내가 '날짜', '유형'과 '상태'와 다른 복합 인덱스가 다음과 같이

내 쿼리입니다. 그러나 그것도 사용하지 않습니다. GROUP BY를 사용하거나 사용하지 않고 시도했습니다. 이 문제 때문에 내 쿼리가 종종 프로덕션에서 시간 초과되었습니다.

+0

주당 합계를 계산하기 위해 주로 6 ~ 7 행만 반환하므로 –

+0

날짜 필드에 날짜 또는 날짜/시간 필드가 있습니까? – Kickstart

+0

예. 그것은 날짜 시간입니다 –

답변

1

이것은 색인이 제대로 사용되지 않는 서버의 색인 해제, 첫 번째 실행 분석 표 때문에 발생합니다.

참고 : 두 서버의 테이블 크기가 다르다고 언급 했으므로 mysql은 자체 인텔리전스에 따라 다른 인덱스를 사용할 수 있습니다. 당신이 당신의 쿼리를위한 최상의 옵션을 안다면 힘 인덱스를 사용할 수 있습니다. 아직 인덱스는 인덱스를 다시 작성해야하는 다음 사용하지 않는 경우

Analyze table mytable; 

는 그런 다음 명령 아래에 사용할 수 있습니다 확인하지만 테이블 크기에 따라 오랜 시간 동안 테이블을 잠글 것 때문에 다운 타임이 필요합니다.

optimize table mytable; 

만약 당신이 그들과 함께 가고 싶지 않다면, 적절한 색인을 강제 할 수 있습니다.

SELECT date(date) as date, SUM(amount) AS points FROM my_table force index(myindex) 
WHERE date BETWEEN '2014-04-17' AND '2014-04-23' 
AND status NOT IN (3,4) AND type NOT IN (5) 
GROUP BY date(date) ORDER BY date DESC; 
+0

감사합니다. @ Zafar. 방금 힘 지수 옵션을 시도했는데 범위를 사용함에 따라 행을 8000 만에서 2000 만으로 줄였습니다. 나는 다른 것들도 시도 할 것이다. –