如果存在记录,则MySQL在DATE搜索的最快方式

时间:2015-02-14 12:34:33

标签: mysql date search select optimization

我找到了许多通过DATE搜索mysql记录的方法

方法1:

SELECT id FROM table WHERE datetime LIKE '2015-01-01%' LIMIT 1

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

SELECT id FROM table WHERE datetime LIKE '2015-01-01%' ORDER BY datetime DESC LIMIT 1

方法3:

SELECT id FROM table WHERE datetime BETWEEN '2015-01-01' AND '2015-01-01 23:59:59' LIMIT 1

方法4:

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

方法5(我认为最慢):

SELECT id FROM table WHERE DATE(`datetime`) = '2015-01-01' LIMIT 1

最快的是什么?

在我的情况下,该表有100万行,搜索日期总是最近的。

2 个答案:

答案 0 :(得分:3)

你提到的最快的方法是

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用于日期算术,因为它很难处理结束条件。而是使用

 WHERE datetime >= '2015-01-01' 
   AND datetime <  '2015-01-02'

此功能与BETWEEN一样好,让您不必将2015-01-01的最后一刻明确写为23:59:59。无论如何,对于更高精度的时间戳,这是不正确的。

答案 1 :(得分:1)

假设日期时间列中的索引存在,最快的方法是方法3的变体,除了两个范围值都是日期时间文字:

SELECT id FROM table
WHERE datetime BETWEEN '2015-01-01 00:00:00' AND '2015-01-01 23:59:59'
LIMIT 1

使用与列相同类型的文字意味着不会对列进行任何转换以执行比较,从而最有可能在列上使用索引。我在制作中使用了这个效果很好。