2012-03-21 2 views
2

그래서 나는 다음과 같은 쿼리가 : 어떤 이유MySQL은 심지어 사용 지수와 힘 인덱스 이후에 생성 된 인덱스를 사용하지

EXPLAIN 
    SELECT 
    id, 
    name, 
    title, 
    description, 
    time 
    FROM entity 
    WHERE 
    (date_end > CURRENT_DATE 
     OR (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME) 
    ) 
    AND (next_date < CURRENT_DATE 
     OR (next_date = CURRENT_DATE AND next_time <= CURRENT_TIME) 
    ) 

를, MySQL은 것을 처리하기 위해 나는이 만들어진 인덱스 (NEXT_DATE, DATE_END)를 사용하지 않는 질문.

내가 할 경우 :

EXPLAIN SELECT id, name, title, description, time FROM entity WHERE (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME) 

그것은

그것은 쿼리에 문제를 보인다 I가 만든 지수 (DATE_END)를 사용하지 않습니다이 부분 DATE_END> CURRENT_DATE와 next_call < CURRENT_DATE입니다 - 때 그 두 부분이 추가되고 인덱스가 사용되지 않습니다.

USE INDEXFORCE INDEX을 사용해 보았지만 동일한 결과 - 색인이 사용되지 않았습니다. 나는 또한 ANALYZE TABLE을 시도했다.

내 테이블 엔티티는 id가 기본 키이고 date_end, next_date 및 (next_date, date_end)에 인덱스가있는 INNODB 테이블입니다.

+0

(next_date, date_end) 대신에 결합 된 인덱스를 만드는 이유는 무엇입니까? next_date의 단순 인덱스? –

+1

테이블의 행 수 일부 쿼리 최적화 프로그램은 행 수가 적을 경우 인덱스를 무시하며 인덱스 페이지를 읽는 오버 헤드가 테이블 스캔 비용을 초과 할 수 있습니다. – james

답변

0

작성한 합성 색인 (next_date, date_end)을 MySQL이 사용할 수있는 방법이 없습니다. 당신의 WHERE 절에서 살펴 보자 :

(date_end > CURRENT_DATE OR (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME)) 
AND 
(next_date < CURRENT_DATE OR (next_date = CURRENT_DATE AND next_time <= CURRENT_TIME)) 

이 NEXT_DATE 및 DATE_END는 "합성"어디에 "일부"가 없다. 이 부분을 보면 MySql은 첫 번째 행을 "확인"하고 두 번째 행을 "해석"하려고합니다. 첫 번째 라인을 보면 next_date와 date_end가 없기 때문에 복합 인덱스는 쓸모가 없다. mysql이 그것을 강제로 사용할 수 없다. 인덱스 (date_end, time_end 및 next_date, next_time)를 만드는 것이 의미가있을 수 있지만 성능 향상 정도는 알 수 없습니다.

관련 문제