mysql – 在SQL中,WHERE子句顺序是否有效?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 在SQL中,WHERE子句顺序是否有效?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1543字,纯文字阅读大概需要3分钟。
内容图文
![mysql – 在SQL中,WHERE子句顺序是否有效?](/upload/InfoBanner/zyjiaocheng/906/9c0074cd3adb42aabd44cdf33f2e32e4.jpg)
我的数据库中有一个表是这样的:
----------------------------------------------------------
| 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部分中的索引,因为它在其他部分中不能,因为它被称为函数.另外,你有未来约会吗?如果没有,为什么不将OR更改为
date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
内容总结
以上是互联网集市为您收集整理的mysql – 在SQL中,WHERE子句顺序是否有效?全部内容,希望文章能够帮你解决mysql – 在SQL中,WHERE子句顺序是否有效?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。