2016-04-14 59 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

您需要“范围”才能获取要使用的索引。 (是的,优化器应该更聪明,但事实并非如此。) –