【问题标题】:Indexes not being shown as possible keys索引未显示为可能的键
【发布时间】:2012-12-02 15:54:39
【问题描述】:

我有几个查询,我为它们创建了 2 个单独的索引,我知道目前它并不真正需要使用它们,因为表不包含那么多行;但是,当我使用 EXPLAIN 时,它们甚至没有被列为 possible key

一个示例查询是:

SELECT 
    id,eventname,details,datestart,dateend,smallimage
FROM
    `events`
WHERE
    CAST(dateend AS DATE) >= CURDATE()
AND
    (state='VIC' OR state = 'ALL')
AND
    STATUS = 1
ORDER BY
    datestart ASC;

备用查询只是在状态前添加另一个AND 子句,例如:

 AND eventcat = 15

现在,我添加了以下两个索引:

KEY `NewIndex4` (`dateend`,`state`,`status`,`datestart`),
KEY `NewIndex5` (`dateend`,`eventcat`,`state`,`status`,`datestart`)

但是,MySQL 仅将以下索引显示为可能的键:

KEY `NewIndex1` (`state`,`status`,`frontpage`,`image`)

我的索引错了吗!?为什么会这样?

【问题讨论】:

    标签: mysql indexing explain


    【解决方案1】:

    问题是您正在对 dateend 字段进行 CAST。当您对字段执行功能时,它不会使用该字段的索引。如果可能,我建议将此字段转换为 DATE 数据类型。如果没有使用索引中的第一个字段,则该索引将被忽略。

    如果该字段是 DATETIME 字段,则不要使用 CAST 函数。只需将其删除并保留为:

    WHERE
        dateend >= CURDATE()
    

    今天的任何日期时间值都将匹配。您不需要删除时间。例如。 2012-12-14 01:00:00 将大于或等于 2012-12-14(CURDATE 函数将返回)。

    【讨论】:

    • 谢谢 - 不幸的是,我们需要花时间在里面;虽然我猜另一种选择是创建两个字段,一个作为DATE,另一个作为DATETIME
    • 如果字段为 DATETIME,则不必更改数据类型。我将编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2021-02-23
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多