2012-12-14 1 views
1

2 개의 별도 인덱스를 작성한 몇 가지 쿼리가 있습니다. 테이블에 많은 행이 포함되어 있지 않기 때문에 실제로는 사용할 필요가 없습니다. 그러나 나는 EXPLAIN을 사용할 때 possible key으로 표시되지 않습니다.가능한 키로 인덱스가 표시되지 않습니다.

예 쿼리는 다음과 같습니다 이제, 나는 다음과 같은 두 개의 인덱스를 추가 한

AND eventcat = 15 

:

SELECT 
    id,eventname,details,datestart,dateend,smallimage 
FROM 
    `events` 
WHERE 
    CAST(dateend AS DATE) >= CURDATE() 
AND 
    (state='VIC' OR state = 'ALL') 
AND 
    STATUS = 1 
ORDER BY 
    datestart ASC; 

대체 쿼리가 바로되고, 주 전에 예를 다른 AND 절을 추가

KEY `NewIndex4` (`dateend`,`state`,`status`,`datestart`), 
KEY `NewIndex5` (`dateend`,`eventcat`,`state`,`status`,`datestart`) 

그러나 MySQL에서는 아래 색인 만 표시합니다. 키 :

KEY `NewIndex1` (`state`,`status`,`frontpage`,`image`) 

내 색인이 잘못되었습니다!? 왜 이렇게합니까?

답변

3

문제는 당신이 dateend 필드에서 CAST를하고 있다는 것입니다. 필드에서 기능을 수행 할 때 해당 필드에 대해 색인을 사용하지 않습니다. 가능하다면이 필드를 DATE 데이터 유형으로 변환하는 것이 좋습니다. 그리고 인덱스의 첫 번째 필드가 사용되지 않으면 인덱스가 무시됩니다.

필드가 DATETIME 필드이면 CAST 함수를 사용하지 않습니다. 간단히 제거하고 그대로 두십시오.

WHERE 
    dateend >= CURDATE() 

오늘의 날짜 시간 값은 일치합니다. 시간을 없애지 않아도됩니다. 예를 들어. 2012-12-14 01:00:00은 CURDATE 함수가 반환하는 2012-12-14보다 크거나 같을 것입니다.

+0

감사합니다. 불행히도 우리는 시간을 지켜야합니다. 다른 옵션은 두 개의 필드를 생성하는 것인데, 하나는 'DATE'로, 다른 하나는 DATETIME으로 생성하는 것입니다. – Brett

+0

필드가 DATETIME이면 데이터 유형을 변경할 필요가 없습니다. 나는 내 대답을 편집 할 것이다. – Tom

+0

좋아, 편집을 마쳤습니다. – Tom

관련 문제