2016-04-14 57 views
0

我有一個表索引列。我想選擇特定日期的所有行。以前我一直在使用這樣的:選擇行日期時間=日期,仍然使用索引

SELECT * 
FROM `table` 
WHERE DATE(date_column) = '2016-04-12'; 

這工作得很好,但我已經注意到性能問題,由於MySQL不使用索引,一旦我應用DATE()功能。我也試過:

SELECT * 
FROM `table` 
WHERE SUBSTR(date_column,1,10) = '2016-04-12'; 

無濟於事。到目前爲止,似乎工作的唯一的事情是:

SELECT * 
FROM `table` 
WHERE date_column >= '2016-04-12' 
    AND date_column < '2016-04-13' 

這最後一個查詢成功使用該索引,但我想知道是否有一種方法,只有一個條件做到這一點。

+0

爲什麼在您的第一個查詢中不能使用'date_column ='2016-04-12 00:00:00.000'?或者在2016-04-12的最後一秒之間。 – Edu

回答

1

我喜歡這種代碼模式;顯然,精確的(無過子時混亂),並且可以使用索引:

WHERE date_column >= '2016-04-12' 
    AND date_column < '2016-04-12' + INTERVAL 1 DAY 

它甚至 '正確' 的DATEDATETIMETIMESTAMPDATETIME(6)

'2016-04-12 00:00:00.000'是相同的'2016-04-12'當在這種情況下使用。我更喜歡後者,因爲它更簡潔。

+0

謝謝,這與我已經得到的非常相似 - 我已修改最後一個查詢以正常工作。但我所問的問題是隻有一種情況才能做到這一點。 – billynoah

+0

您需要「範圍」才能獲取要使用的索引。 (是的,優化器應該更聰明,但事實並非如此。) –