当前位置: 首页 > 面试题库 >

在MySQL中搜索日期范围的最有效方法是什么?

平航
2023-03-14
问题内容

我想问一下在两个日期之间搜索数据的最有效(最快)方法是什么?

让我们考虑以下简单查询:

SELECT Date_,counter1,counter2,...
WHERE (date range condition)

“ Date_”列是DATETIME类型。

我尝试了不同的选择,例如:

WHERE Date_ >= '2012-12-01 00:00:00' AND Date_ <= '2012-12-05 00:00:00'

WHERE Date_ BETWEEN '2012-12-01 00:00:00' AND '2012-12-05 00:00:00'

WHERE Date_ = '2012-12-01 00:00:00' OR Date_ = '2012-12-02 00:00:00' OR
Date_ = '2012-12-03 00:00:00' OR Date_ = '2012-12-04 00:00:00' OR
Date_ = '2012-12-05 00:00:00'

实际上,此Select查询要复杂得多(具有联接和更多条件)。这只是简化版本。根据EXPLAIN,查询的执行方式没有区别。我需要说Date_列已建立索引。不幸的是,我无法测试实际的查询速度,因为我无法避免操作系统缓存,但是至少没有使用MySQL缓存(SQL_NO_CACHE)。

根据您的经验,有没有一种更快的日期间隔搜索功能(没有功能)?

三种方法中哪一种比较快(万一完全不同)?

在此先多谢!


问题答案:

效率的最大因素将是合适索引的可用性以及有效执行计划的生成。

我们用于搜索日期时间范围的规范模式是使用大于和等于以及小于(但不等于)的比较。

为了获取一天中的所有日期时间,例如“ 2012-12-01”,我们通常将代码编写为:

WHERE datetimecol >= '2012-12-01'
  AND datetimecol <  '2012-12-02'

-要么-

WHERE datetimecol >= '2012-12-01'
  AND datetimecol <  '2012-12-01' + INTERVAL 1 DAY

同样,要获取示例中的五天范围:

WHERE datetimecol >= '2012-12-01'
  AND datetimecol <  '2012-12-06'

-要么-

WHERE datetimecol >= '2012-12-01'
  AND datetimecol <  '2012-12-01' + INTERVAL 5 DAY

要回答您的问题,“有没有更快的方法?” 否。这种形式的谓词使MySQL可以对索引(如果有合适的索引可用)执行范围扫描。没有比这更有效的了。



 类似资料:
  • 问题内容: 我有一个包含嵌套列表的列表,我需要知道在这些嵌套列表中搜索的最有效方法。 例如,如果我有 并且我必须搜索上面的整个列表,找到“ d”的最有效方法是什么? 问题答案: 使用列表推导,给出: 产量: 这也可以使用生成器来完成(如@AshwiniChaudhary所示) 根据以下评论进行更新: 这是相同的列表理解,但是使用了更具描述性的变量名: 列表理解部分中的循环构造等效于 并生成一个列表

  • 问题内容: 动态创建日期范围以便与报表配合使用的最佳方法。 因此,如果给定的一天没有活动,我可以避免报表上的空行。 通常是为了避免此问题:在sql结果中(在mysql或perl端)填充空日期的最直接方法是什么? 问题答案: 在MySQL中,没有直接的方法可以做到这一点。最好的选择是用您选择的服务器端语言生成一个daterange数组,然后从数据库中提取数据,并使用date作为键将结果数组与date

  • 我有一张表,上面有房间的开始和结束日期。我写了这个SQL: 这些房间在这段时间内是有效的。但是,当我这样过滤的时候, 我没有结果。这些日期就像一个数组: 所以,你可以看到那个房间在2022-12-30是活动的,但我不能得到它。我怎么能那样做? 希望我能很好地表达自己。

  • 目前我正在尝试用下面的代码将当前日期修剪成日、月和年。 null 我在下面的技术中尝试了我的代码。设置:使用Python 3.5.2(x64)、Python 3.6.1(x64)的local machine和使用Python 3.6.1的Repl.it 联机试用代码,复制并粘贴行代码

  • 问题内容: 我有一个数据库,其中有75,000+行,每天添加500多个条目。 每行都有标题和描述。 我创建了一个RSS feed,为您提供了特定搜索词的最新条目(例如,http://site.com/rss.rss?q = Pizza将为搜索词“ Pizza”输出RSS)。 我想知道什么是为此编写SQL查询的最佳方法。现在我有: 但是问题是执行查询需要2到10秒。 有没有更好的方法来编写查询,我是

  • 问题内容: 我有一个ID为,状态和员工日期范围的数据集。 下面给出的输入数据集是一名员工的详细信息。 记录中的日期范围是连续的(按确切顺序),因此第二行的开始日期将是第一行的结束日期的下一个日期。 如果员工连续休假不同的月份,则该表将存储日期范围不同的信息。 例如:在输入集中,员工已从‘16 -10-2016’休病假到‘31 -12-2016’,并在‘1-1-2017’重新加入。 因此,该项目有3