连接表结果计算mysql性能

时间:2013-08-24 19:48:03

标签: mysql join indexing

我的restaurants表包含结构id, name, table_countorders表,结构为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列要贵得多)。或者,添加该条件将添加一个要检查的东西,它会产生相反的效果吗?

由于

1 个答案:

答案 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')...