mysql - 在 SQL 中,WHERE 子句的顺序有什么影响吗?

标签 mysql sql where-clause

我的数据库中有一个这样的表:

 ----------------------------------------------------------
| 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/

相关文章:

mysql - Rails 十进制迁移生成整数列

python - 如何插入多对多关系的记录?

sql - 展平表层次结构

haskell - Haskell中的多个where语句有什么办法吗

mysql - 从Where子句计算行数并在不同的列中显示每个计数

PHP Web 应用程序 : mysql database design best practices question

mysql - 如何结合 OR 和 AND 按您的想法进行工作

mysql - SQL - 创建连接在一起的多个表的 View

sql - 如何根据另一张表的引用数据过滤一张表的数据?

MySQL 在一组值中查找多个结果