两个日期时间之间的MySQL不使用索引

两个日期时间之间的MySQL不使用索引,mysql,between,Mysql,Between,如您所见,ref为空,并通过23行,而不是仅通过1行。现在对于这个例子来说,这是很快的,但是当我在1-2个月的范围内进行操作时,行变为>10000,这会大大降低页面速度并锁定表 注意如果我删除00:00:00和23:59:59则它使用索引,它只通过一行,但我需要选择从00:00开始到23:59结束的一整天的所有数据 请帮助我重新构造此查询以修复此问题或建议任何可能的解决方案。多谢各位 编辑 用或或=替换之间的不会解决问题此查询使用索引。 选择类型为范围,使用的键为已创建 对于范围类型,ref列

如您所见,ref为空,并通过23行,而不是仅通过1行。现在对于这个例子来说,这是很快的,但是当我在1-2个月的范围内进行操作时,行变为>10000,这会大大降低页面速度并锁定表

注意如果我删除00:00:0023:59:59则它使用索引,它只通过一行,但我需要选择从00:00开始到23:59结束的一整天的所有数据

请帮助我重新构造此查询以修复此问题或建议任何可能的解决方案。多谢各位

编辑


=替换之间的不会解决问题此查询使用索引。
选择类型为
范围
,使用的键为
已创建


对于范围类型,
ref
列始终为空,
请参阅文档:

范围

仅检索给定范围内的行,使用索引选择行。输出行中的键列指示使用哪个索引。密钥包含所使用的最长密钥部分此类型的ref列为空。


(emphasis mine)

当您将datetime字段与大于/小于比较中的字符串进行比较时。如果您使用cast或函数(如UNIX_TIMESTAMP())并将其他日期也转换为unixtimestamp,这将起到作用,但会破坏索引的使用。也许更好的解决方案是将日期存储为表中的unix时间戳,并在其上放置索引


另一种方法是,您可以在sql中添加“limit”,这也适用于我

如果您将
替换为
(“2014-02-24”已经做到了,在不同的变体中,仍然没有使用表的indexPlease post结构,或者至少在查询中为列名添加前缀,很难猜测哪列属于哪一个表。
NoteVisible
是否属于
Notes
?是的NoteVisible属于Notes为什么它属于任何存在ted表?但如果我删除解释,该范围内没有23行。它只返回1行。这只是一个估计值-MySql认为有23行。它在解析阶段没有检查行的确切数量,它只是估计。但是考虑到这一点,它认为使用该索引并连接23行比使用prima更好ry键并连接X行。有没有办法解决此问题?
explain
SELECT COUNT(*) AS Count, CreatedBy
FROM `Notes`
INNER JOIN Users ON UserID = CreatedBy
INNER JOIN UserRoles ON URoleID = RoleID AND RoleID = 1
WHERE NoteVisible = 1 AND NoteText NOT LIKE '%SOME KEYWORD%' 
      AND Created BETWEEN '2014-02-24 00:00:00' AND '2014-02-24 23:59:59' 
GROUP BY CreatedBy