我的restaurants
表包含结构id, name, table_count
和orders
表,结构为restaruant_id, start_date, end_date, status
。我想找到那些可用于某些日期范围的表 - 可用 - 被认为是那些,没有订单,或者给定日期范围的已确认预订数(状态= 1)小于表的数量算那家餐馆。所以,我使用这个查询
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')
)
)
那么,我可以用更快的其他方式进行相同的查询。我正在考虑这种方式,因为在订单表中它可能是数千或更多行,并且因为它应该将日期列比较在某个日期范围之间,如果我添加一列{{1具有值1或0的(带有mysql索引),可以通过cron作业更新,定期检查并将过去的预约设置为0,因此在搜索期间,仅比较当前或将来的订单时日期范围(我认为比1或0的tinyint列要贵得多)。或者,添加该条件将添加一个要检查的东西,它会产生相反的效果吗?
由于
答案 0 :(得分:0)
在0和1上进行索引并不是一个好主意。在你的情况下,对于记录的thousonds,索引的选择性很差,并且根本不能使用。
如果在start_data和end_data上构建comoposite索引,则可以加快查询速度。 并重写查询以在日期列中使用非“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')...