我有一个带有几列的MySQL innodb表。其中一个名为"dateCreated“,它是一个DATETIME
列,并被索引。
我的问题是:
SELECT
*
FROM
`table1`
WHERE
DATE(`dateCreated`) BETWEEN '2014-8-7' AND '2013-8-7'
MySQL出于某种原因拒绝使用dateCreated
列上的索引(即使使用USE INDEX
或FORCE INDEX
)。
但是,如果我将查询更改为:
SELECT
*
FROM
`table1`
WHERE
`dateCreated` BETWEEN '2014-8-7' AND '2013-8-7'
注意 DATE(...)
removal
MySQL很好地使用了索引。我可以不使用DATE()函数来管理,但这对我来说很奇怪。
我知道MySQL可能会索引完整的日期和时间,当只搜索其中的一部分时,它会感到困惑或什么的。但是,必须有一种方法来使用部分日期(比如MONTH(...)
或DATE(...)
),并且仍然可以从索引列中获益,并避免进行完整的表扫描。
有什么想法吗..?
谢谢。
发布于 2014-08-07 08:51:59
正如您所观察到的,一旦将函数应用到该字段,就会破坏对索引的访问。所以,
如果您不在.之间使用.,那么将函数应用到数据的基本原理是,这样您就可以得到匹配参数的数据。只有两个参数日期和几百个参数?千人?百万?一排排数据。为什么不改变这一点,改变参数以适应数据?(使其成为"sargable“谓词)
SELECT
*
FROM
`table1`
WHERE
( `dateCreated` >= '2013-08-07' AND `dateCreated` < '2014-08-07' )
;
dateCreated
)和间隔将包含1天,因为'2014-08-07‘期间的所有事件都将包括在内。如果你有意想要一年零一天,那就把一天加到更高的日期,也就是说是< '2014-08-08‘。https://stackoverflow.com/questions/25177641
复制相似问题