Mysql 日期范围内的记录-性能

Mysql 日期范围内的记录-性能,mysql,sql,date,Mysql,Sql,Date,这里有个问题。我有一张桌子 flightdetails -----------+------------- flightName | varchar(200) 出发日期 到达日期 我想得到给定日期范围内的所有航班。fromDate或toDate应在给定的日期范围内。我知道有一个简单的查询会给出结果 select flightname from flightdetails where (departure between fromDate and toDate) or (arrival betw

这里有个问题。我有一张桌子

flightdetails
-----------+-------------
flightName | varchar(200)
出发日期
到达日期
我想得到给定日期范围内的所有航班。fromDate或toDate应在给定的日期范围内。我知道有一个简单的查询会给出结果

select flightname from flightdetails where (departure between fromDate and toDate)
or (arrival between fromDate and toDate);

但这对性能不好,因为我使用了OR条件。有人能提出一个更好的解决方案吗?这也是一个常见的解决方案。每个子查询都可以这样使用索引

select flightname from flightdetails where departure between fromDate and toDate
union
select flightname from flightdetails where arrival between fromDate and toDate;

来自@SalmanA的重新评论

你说得对,上面的查询忽略了如下情况:

departure < fromDate < toDate < arrival

这是解决这个问题的常见方法。每个子查询都可以这样使用索引

select flightname from flightdetails where departure between fromDate and toDate
union
select flightname from flightdetails where arrival between fromDate and toDate;

来自@SalmanA的重新评论

你说得对,上面的查询忽略了如下情况:

departure < fromDate < toDate < arrival

我认为您可以使用以下查询:


我认为您可以使用以下查询:



到达总是>=离开,对吗?是的。到达时间大于出发时间到达时间总是>=出发时间,对吗?是的。到达的人比离开的人要多。但是,如果我们考虑数百万的数据,联合会由于重复检查而减速。如果我错了,请纠正我。Union只需要删除匹配行中的重复项,而不是所有数百万行。谢谢您的建议。在一次采访中,有人问我同样的问题,我也告诉了我这个解决方案。但面试官并不满意,并要求更好的解决方案。就连我自己也没有想到比这个解决方案更多的东西。这就是为什么要检查更好的可用性。。。再次感谢您,如果出发<从日期到今天<到达怎么办?罕见但可能发生。@SalmanA,说得好,我的查询符合OP问题中的逻辑,但这不会返回fromDate和toDate之间的所有航班。谢谢你的建议。但是,如果我们考虑数百万的数据,联合会由于重复检查而减速。如果我错了,请纠正我。Union只需要删除匹配行中的重复项,而不是所有数百万行。谢谢您的建议。在一次采访中,有人问我同样的问题,我也告诉了我这个解决方案。但面试官并不满意,并要求更好的解决方案。就连我自己也没有想到比这个解决方案更多的东西。这就是为什么要检查更好的可用性。。。再次感谢您,如果出发<从日期到今天<到达怎么办?罕见但可能的情况。@SalmanA,说得好,我的查询符合OP问题中的逻辑,但这不会返回fromDate和toDate之间的所有航班。这不会返回我的所有记录。例如,如果我的到达日期是在日期范围内,并且日期早于起始日期,我仍然希望看到该记录。希望我很清楚,再试试看。它应该可以工作(至少在我使用它检查冲突预订时是这样)。它返回正确的行集,但单个索引不能受益于两个范围条件。这不会返回我的所有记录。例如,如果我的到达日期是在日期范围内,并且日期早于起始日期,我仍然希望看到该记录。希望我很清楚,再试试看。它应该可以工作(至少在我使用它检查冲突预订时是这样),它返回正确的行集,但是一个索引不能使两个范围条件受益。
SELECT flightname
FROM   flightdetails
WHERE  toDate >= departure AND arrival >= fromDate