MySQL 按 DATE 搜索记录是否存在的最快方法

ipe*_*pel 3 mysql optimization search select date

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

方法一:

SELECT id FROM table WHERE datetime LIKE '2015-01-01%' LIMIT 1
Run Code Online (Sandbox Code Playgroud)

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

SELECT id FROM table WHERE datetime LIKE '2015-01-01%' ORDER BY datetime DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

方法三:

SELECT id FROM table WHERE datetime BETWEEN '2015-01-01' AND '2015-01-01 23:59:59' LIMIT 1
Run Code Online (Sandbox Code Playgroud)

方法四:

SELECT id FROM table WHERE DATE_FORMAT( datetime, '%y.%m.%d' ) = DATE_FORMAT( '2015-01-01', '%y.%m.%d' )
Run Code Online (Sandbox Code Playgroud)

方法5(我认为是最慢的):

SELECT id FROM table WHERE DATE(`datetime`) = '2015-01-01' LIMIT 1
Run Code Online (Sandbox Code Playgroud)

什么是最快的?

就我而言,该表有 100 万行,并且搜索日期始终是最近的。

O. *_*nes 5

您提到的最快的方法是

SELECT id 
  FROM table 
 WHERE datetime BETWEEN '2015-01-01' AND '2015-01-01 23:59:59'
 LIMIT 1
Run Code Online (Sandbox Code Playgroud)

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

您的其他搜索方式对每一行应用一个函数:

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

使用这些函数可以胜过使用索引来查找数据。

专业提示:不要用于BETWEEN日期算术,因为它不能很好地处理结束条件。而是使用

 WHERE datetime >= '2015-01-01' 
   AND datetime <  '2015-01-02'
Run Code Online (Sandbox Code Playgroud)

这样做的效果同样好,并且BETWEEN让您不必将最后时刻2015-01-01显式地写为 as 23:59:59。无论如何,对于更高精度的时间戳来说,这是不正确的。