首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么MySQL在使用日期时会删除我的索引(` using `.`‘)

为什么MySQL在使用日期时会删除我的索引(` using `.`‘)
EN

Stack Overflow用户
提问于 2014-08-07 08:27:32
回答 1查看 103关注 0票数 1

我有一个带有几列的MySQL innodb表。其中一个名为"dateCreated“,它是一个DATETIME列,并被索引。

我的问题是:

代码语言:javascript
运行
复制
        SELECT 
            *
        FROM 
            `table1`
        WHERE 
            DATE(`dateCreated`) BETWEEN '2014-8-7' AND '2013-8-7'

MySQL出于某种原因拒绝使用dateCreated列上的索引(即使使用USE INDEXFORCE INDEX )。

但是,如果我将查询更改为:

代码语言:javascript
运行
复制
        SELECT 
            *
        FROM 
            `table1`
        WHERE 
           `dateCreated` BETWEEN '2014-8-7' AND '2013-8-7'

注意 DATE(...) removal

MySQL很好地使用了索引。我可以不使用DATE()函数来管理,但这对我来说很奇怪。

我知道MySQL可能会索引完整的日期和时间,当只搜索其中的一部分时,它会感到困惑或什么的。但是,必须有一种方法来使用部分日期(比如MONTH(...)DATE(...)),并且仍然可以从索引列中获益,并避免进行完整的表扫描。

有什么想法吗..?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-08-07 08:51:59

正如您所观察到的,一旦将函数应用到该字段,就会破坏对索引的访问。所以,

如果您不在.之间使用.,那么将函数应用到数据的基本原理是,这样您就可以得到匹配参数的数据。只有两个参数日期和几百个参数?千人?百万?一排排数据。为什么不改变这一点,改变参数以适应数据?(使其成为"sargable“谓词)

代码语言:javascript
运行
复制
    SELECT 
        *
    FROM 
        `table1`
    WHERE 
         ( `dateCreated` >= '2013-08-07' AND `dateCreated` < '2014-08-07' )

    ;
  • 注:首先使用的是2013-08-07,如果在也使用之间使用,则这必须是正确的。如果第一次约会比第二次约会年轻,你将不会在第二次约会之间得到任何结果。
  • 还要注意的是,精确地包含了12个月的数据,其中包含了>= '2013-08-07‘和< '2014-08-07',我想这就是你想要的。
  • 使用日期组合(dateCreated)和间隔将包含1天,因为'2014-08-07‘期间的所有事件都将包括在内。如果你有意想要一年零一天,那就把一天加到更高的日期,也就是说是< '2014-08-08‘。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25177641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档