【问题标题】:What is the most efficient way to search in date ranges in MySQL?在 MySQL 中搜索日期范围的最有效方法是什么?
【发布时间】:2013-01-08 10:38:50
【问题描述】:

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

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

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_ 列已编入索引。不幸的是,我无法测试真正的查询速度,因为我无法避免OS缓存,但至少没有使用MySQL缓存(SQL_NO_CACHE)。

根据您的经验,是否有更快的方法来搜索日期间隔(不使用函数)?

这三种方法中哪一种更快(以防完全不同)?

提前非常感谢!

【问题讨论】:

  • 你忘记了where date_ in ('2012-12-01', '2012-12-02', etc...)。从技术上讲,where or or or orwhere in 版本的性能应该没有任何差异。它们都将在内部进行相同的解析/执行。
  • 除了测试之外,很难用事实来备份,但作为一般的经验法则,当计划相同时 - 解析更少,CPU浪费更少。带有两个参数(前两个示例之一)的准备好的语句应该会更快。
  • 查询 1 和 3 或 2 和 3 不等价。

标签: mysql date


【解决方案1】:

效率的重要因素将是合适索引的可用性以及高效执行计划的生成。

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

要获取一天的所有日期时间,例如“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 能够对索引执行范围扫描(假设有合适的索引可用)。没有比这更有效的了。

【讨论】:

  • 谢谢,斯宾塞!我使用 MySQL(不大)的经验以及我检查过的所有论坛都向我表明,最大的因素确实是正确的索引。事实上,完成此日期间隔搜索的完整查询已发布在此处:link。不幸的是,我没有收到任何答案,但我会以不同的形式重新发布该问题,例如:“在解释的情况下您将使用什么索引”。
猜你喜欢
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2013-05-14
相关资源
最近更新 更多