索引未显示为可能的键

时间:2012-12-14 16:04:56

标签: mysql indexing explain

我有几个查询,我为它创建了两个单独的索引,我理解它目前并不需要使用它们,因为表中不包含那么多行;但是当我使用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`)

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

1 个答案:

答案 0 :(得分:3)

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

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

WHERE
    dateend >= CURDATE()

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