【发布时间】:2014-02-24 15:52:21
【问题描述】:
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
如您所见,ref 为 NULL,并且经过 23 行,而不仅仅是经过 1 行。现在对于这个例子来说这很快,但是当我做 1-2 个月的范围时,行变成 >10000 并且它减慢了页面并锁定了表格。
注意如果我删除 00:00:00 和 23:59:59 然后它使用索引它只经过 1 行但我需要选择从 00:00 开始到 23:59 结束的一整天的所有数据。
请帮助我重组此查询以解决此问题或提出任何可能的解决方案。谢谢。
编辑
将 BETWEEN 替换为 或 > 或 或 >=没有解决问题
【问题讨论】:
-
如果用
BETWEEN代替('2014-02-24' <= Created AND Created < '2014-02-25')会怎样? -
已经在不同的变体中这样做了仍然不使用索引
-
请贴出表的结构,或者至少给查询中的列名加上前缀,很难猜出哪个列属于哪个表。
NoteVisible是否属于Notes? -
是 NoteVisible 属于笔记,为什么它会属于任何呈现的表格?