首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果存在记录,MySQL按日期搜索的最快方法

如果存在记录,MySQL按日期搜索的最快方法
EN

Stack Overflow用户
提问于 2015-02-14 12:34:32
回答 2查看 2.6K关注 0票数 3

我找到了许多按日期搜索mysql记录的方法。

方法1:

代码语言:javascript
运行
复制
SELECT id FROM table WHERE datetime LIKE '2015-01-01%' LIMIT 1

方法2(与方法1+ ORDER BY)相同:

代码语言:javascript
运行
复制
SELECT id FROM table WHERE datetime LIKE '2015-01-01%' ORDER BY datetime DESC LIMIT 1

方法3:

代码语言:javascript
运行
复制
SELECT id FROM table WHERE datetime BETWEEN '2015-01-01' AND '2015-01-01 23:59:59' LIMIT 1

方法4:

代码语言:javascript
运行
复制
SELECT id FROM table WHERE DATE_FORMAT( datetime, '%y.%m.%d' ) = DATE_FORMAT( '2015-01-01', '%y.%m.%d' )

方法5(我认为最慢):

代码语言:javascript
运行
复制
SELECT id FROM table WHERE DATE(`datetime`) = '2015-01-01' LIMIT 1

最快的是什么?

在我的例子中,表有100万行,搜索日期总是最近的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-14 13:08:03

你提到的最快的方法是

代码语言:javascript
运行
复制
SELECT id 
  FROM table 
 WHERE datetime BETWEEN '2015-01-01' AND '2015-01-01 23:59:59'
 LIMIT 1

当您在datetime列上创建索引时,这是快速的。可以随机访问索引以找到第一个匹配行,然后扫描到最后一个匹配行。因此,没有必要阅读整个表,甚至整个索引。而且,当您使用LIMIT 1时,它只读取一行。非常快,甚至在一张巨大的桌子上。

您的其他搜索方法将函数应用于每一行:

  • datetime LIKE '2011-01-01%'datetime转换为每一行的字符串。
  • 方法3、4和5都对每一行的内容使用显式函数(如DATE() )。

使用这些函数可以避免使用索引来查找数据。

提示:不要使用BETWEEN来计算日期,因为它处理结束条件很差。相反,使用

代码语言:javascript
运行
复制
 WHERE datetime >= '2015-01-01' 
   AND datetime <  '2015-01-02'

这与BETWEEN一样好,并使您不必将2015-01-01的最后一刻显式地写成23:59:59。无论如何,使用更高精度的时间戳是不正确的。

票数 5
EN

Stack Overflow用户

发布于 2015-02-14 13:35:42

假设日期时间列上有索引,最快的方法是方法3的变体,但这两个范围值都是日期时间文本:

代码语言:javascript
运行
复制
SELECT id FROM table
WHERE datetime BETWEEN '2015-01-01 00:00:00' AND '2015-01-01 23:59:59'
LIMIT 1

使用与该列相同类型的文字意味着不会对该列进行任何转换来执行比较,从而给出了在该列上使用索引的最佳机会。我在生产中使用了这个方法,效果很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28515685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档