2012-12-14 47 views
1

我有幾個查詢,我創建了2個單獨的索引,我明白它並不真正需要使用它們,因爲表不包含那麼多行;但是,當我使用EXPLAIN時,它們甚至不會列爲possible key索引沒有被顯示爲可能的鍵

示例查詢是:

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子句前的狀態,一個例子是:

AND eventcat = 15 

現在,我已經添加了以下兩個指標:

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

但是,MySQL只顯示下面的索引作爲可能le key:

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

我的索引是否錯了!?它爲什麼這樣做?

回答

3

問題是你在datee字段上做了CAST。在字段上執行功能時,它不會使用該字段的索引。如果可能的話,我會建議將此字段轉換爲DATE數據類型。如果索引中的第一個字段未被使用,索引將被忽略。

如果該字段是DATETIME字段,則不使用CAST函數。只需將其刪除並保留爲:

WHERE 
    dateend >= CURDATE() 

任何用於今天的日期時間值都將匹配。你不需要消除時間。例如。 2012-12-14 01:00:00將大於或等於2012-12-14(CURDATE函數將返回)。

+0

謝謝 - 不幸的是我們需要保持時間;儘管我猜想另一種選擇是創建兩個字段,一個是'DATE',另一個是'DATETIME'。 – Brett

+0

如果該字段是DATETIME,則不必更改數據類型。我將編輯我的答案。 – Tom

+0

好的,完成編輯。 – Tom

相關問題