【发布时间】:2014-08-07 08:27:32
【问题描述】:
我有一个包含几列的 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(...)删除
MySQL 使用索引很好。 我可以不使用 DATE() 函数来管理,但这对我来说很奇怪。
我知道 MySQL 可能会索引完整的日期和时间,当只搜索其中的一部分时,它会变得混乱或其他什么。但是必须有一种方法可以使用部分日期(比如说MONTH(...) 或DATE(...)),并且仍然可以从索引列中受益并避免全表扫描。
有什么想法吗?
谢谢。
【问题讨论】:
-
MySQL 不能对这样的表达式使用索引。因此,请注意仅在比较运算符的右侧使用函数。
标签: mysql sql indexing query-optimization innodb