1

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

一个示例查询是:

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`)

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

4

1 回答 1

3

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

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

WHERE
    dateend >= CURDATE()

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

于 2012-12-14T16:19:20.763 回答