我的数据库中有一个这样的表:
----------------------------------------------------------
| event_id | date | start_time | end_time | duration |
----------------------------------------------------------
| 1 | 2011-05-13 | 01:00:00 | 04:00:00 | 10800 |
| 2 | 2011-05-12 | 17:00:00 | 01:00:00 | 28800 |
| 3 | 2011-05-11 | 11:00:00 | 14:00:00 | 10800 |
----------------------------------------------------------
此示例数据并未提供完全准确的图片,通常每天每个小时都有事件发生。 日期始终指的是 start_time,因为 end_time 有时可能是第二天。 持续时间以秒为单位。
SELECT *
FROM event_schedules
WHERE (
date = CURDATE() //today
OR
date = DATE_SUB(CURDATE(), INTERVAL 1 DAY) //yesterday
)
// and ended before now()
AND DATE_ADD(CONCAT(date, ' ', start_time), INTERVAL duration SECOND) < NOW()
ORDER BY CONCAT(date, ' ', start_time) DESC
LIMIT 1
我在那里有一个子句,括号中的 OR'ed 子句,这是不必要的。我希望它可以通过首先过滤掉不是今天或昨天开始的任何“事件”来缩短查询时间。找到最近“事件”的唯一方法是对记录进行排序并取第一个。通过添加这个额外的不必要的子句,我实际上是在减少需要订购的记录列表吗?如果是这样,我无法想象优化器能够进行这种优化,大多数与此类似的其他问题都在谈论优化器。
最佳答案
为提高性能向 WHERE 子句添加过滤器时要小心。虽然它可以减少需要搜索的总行数,但如果过滤大量记录而不使用索引,实际过滤器本身可能会导致更高的成本。在您的情况下,如果列日期被索引,您可能会获得更好的性能,因为它可以在 OR 部分使用索引,而在其他部分则不能,因为它是作为函数调用的。另外,你可以有 future 的约会吗?如果不是,为什么不将 OR 更改为
date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
关于mysql - 在 SQL 中,WHERE 子句的顺序有什么影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5981229/