我找到了许多按日期搜索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万行,搜索日期总是最近的。
发布于 2015-02-14 13:08:03
你提到的最快的方法是
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转换为每一行的字符串。DATE() )。使用这些函数可以避免使用索引来查找数据。
提示:不要使用BETWEEN来计算日期,因为它处理结束条件很差。相反,使用
WHERE datetime >= '2015-01-01'
AND datetime < '2015-01-02'这与BETWEEN一样好,并使您不必将2015-01-01的最后一刻显式地写成23:59:59。无论如何,使用更高精度的时间戳是不正确的。
发布于 2015-02-14 13:35:42
假设日期时间列上有索引,最快的方法是方法3的变体,但这两个范围值都是日期时间文本:
SELECT id FROM table
WHERE datetime BETWEEN '2015-01-01 00:00:00' AND '2015-01-01 23:59:59'
LIMIT 1使用与该列相同类型的文字意味着不会对该列进行任何转换来执行比较,从而给出了在该列上使用索引的最佳机会。我在生产中使用了这个方法,效果很好。
https://stackoverflow.com/questions/28515685
复制相似问题