我有一个表格,其中包含start_date
和end_date
(两者都是索引,DATE格式)的条目。我想返回今天在这两个日期之间的所有条目的列表。以下是我考虑过的两个选项:
1)直接查询: MySQL查询(其中28/02/2014当然是可变的):
SELECT * FROM mytable WHERE '28/02/2014' BETWEEN start_date AND end_date
2)每日cronjob遍历所有条目并更新字段is_valid
(布尔格式),当今天在两个日期之间时为true,否则为false(此处性能不太重要,因为它不是客户 - 面对)。然后用于选择条目的MySQL查询将是:
SELECT * FROM mytable WHERE is_valid = 1
最终目标是在条目未来达到100,000甚至数百万时,获得最快的查询(将在搜索结果中使用,这将是网站的一个重要页面)。我不确定索引日期是否足够好,或者cronjob是否过度 - 或者是否有更好的方法可以做到这一点!
提前感谢您选择哪个选项的建议!
编辑:感谢回复 - 这个索引结构好吗?答案 0 :(得分:0)
之前我使用过相同的模式。如果您有正确的索引,那么带有日期的查询就足够快了。
答案 1 :(得分:0)
如果您希望在这两个选项之间进行更快的查询,那么就没有像cron作业那样适当地设置标志。然后,您应该索引结果列,否则您必须执行全表扫描。如果没有索引,这种方法可能比使用带索引的日期要慢。
对于大多数用途,start_date
和end_date
上的复合索引是首选解决方案,应该足够快。
我怀疑你正在提交过早优化的守护进程。最快的方法是运行一个cron作业并将今天的数据加载到一个新表中,为您的分析正确编制索引和结构。除此之外,综合指数是一种非常合理的方法。虽然更新标志确实解决了问题,但它既不是最快也不是最干净的方法。