gpt4 book ai didi

mysql - 连接表结果计数mysql性能

转载 作者:行者123 更新时间:2023-11-30 01:22:07 27 4
gpt4 key购买 nike

我有restaurants具有结构的表,id, name, table_count ,和orders table ,带结构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')
)
)

那么,我可以用其他更快的方式进行相同的查询吗?我以这种方式思考,因为在一段时间内,订单表中可能有数千行或更多行,并且因为它应该比较某个日期范围之间的日期列,如果我添加一列 is_search ,结果会更快吗? (带有mysql索引)值为1或0,可以通过cron作业更新,定期检查并保留过去的订单为0,因此在搜索时比较日期时仅考虑当前或 future 的订单range(我认为这比比较 1 或 0 的tinyint 列要贵得多)。或者,添加该条件会增加一项要检查的内容,并且会产生相反的效果?

谢谢

最佳答案

在 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')...

关于mysql - 连接表结果计数mysql性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18422502/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com