0

我有restaurants带有结构的表格,id, name, table_count和带有结构的表格。我想找到那些在某些日期范围内可用的表格 - 如果可用 - 考虑到那些,要么没有订单,要么给定日期范围内确认的预订数量(状态 = 1)小于表格数量算上那家餐厅。所以,我使用这个查询ordersrestaruant_id, start_date, end_date, status

SELECT r.id, r.name, r.table_count
FROM restaurants r
LEFT JOIN orders o 
ON r.id = o.restaurant_id 
WHERE o.id IS NULL 
OR (r.table_count > (SELECT COUNT(*) 
                FROM orders o2 
                WHERE o2.restaurant_id = r.id AND o2.status = 1 AND
                NOT(o.start_date >= '2013-09-10') AND NOT (o.end_date <= '2013-09-05')
            )
) 

那么,我能否以其他更快的方式进行相同的查询。我是这样想的,因为在时间期间,订单表中可能有数千行或更多行,并且因为它应该比较日期列在某个日期范围之间,如果我添加一列is_search(使用 mysql index) 值为 1 或 0,可以通过 cron 作业更新,定期检查并从过去预订为 0,因此在搜索时,比较日期范围时只会考虑现在或未来的订单(其中我认为比为 1 或 0 比较 tinyint 列要贵得多)。或者,添加该条件会增加一件事要检查,它会产生相反的效果?

谢谢

4

1 回答 1

0

在 0 和 1 上建立索引并不是一个好主意。在您有数千条记录的情况下,该索引的选择性很差,并且可能根本不使用。

如果您在 start_data 和 end_data 上构建复合索引,则可以加快查询速度。并将查询重写为在日期列中使用非“NOT”子句。因为 NOT 将对表进行排序而不是使用索引。

你查询

...NOT(o.start_date >= '2013-09-10') AND NOT (o.end_date <= '2013-09-05')..

可以定义

...(o.start_date <'2013-09-10') AND (o.end_date > '2013-09-05')...

于 2013-08-24T20:29:07.597 回答