我有几个查询,我为它创建了两个单独的索引,我理解它目前并不需要使用它们,因为表中不包含那么多行;但是当我使用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`)
我的索引是错的!?为什么这样做?
答案 0 :(得分:3)
问题是你在dateend字段上进行CAST。在字段上执行函数时,它不会使用该字段的索引。如果可能,我建议将此字段转换为DATE数据类型。如果未使用索引中的第一个字段,则将忽略该索引。
如果该字段是DATETIME字段,则不使用CAST函数。只需将其删除并保留为:
WHERE
dateend >= CURDATE()
今天的任何日期时间值都将匹配。您不需要删除时间。例如。 2012-12-14 01:00:00将大于或等于2012-12-14(CURDATE函数将返回)。