从最后一行开始搜索mysql表

4

我知道在关系型数据库中并不存在“最后一行”这种说法,但是我找不到更好的词来解释我想要做什么。我有一张表格长得像下面这样,其中id是一个AUTO_INCREMENT字段,而time则是当前的Unix时间戳。请注意,我可以在不同的行上拥有相同的时间戳。

    ╔════╦════════════╦════════════╦═════════════╦════════════╗
    ║ id ║  field_1   ║   field_2  ║   field_n   ║    time    ║
    ╠════╬════════════╬════════════╬═════════════╬════════════╣
    ║  1 ║ data_field ║ data_field ║ data_field  ║ 1369748934 ║
    ║  2 ║ data_field ║ data_field ║ data_field  ║ 1369748935 ║
    ║  3 ║ data_field ║ data_field ║ data_field  ║ 1369748936 ║
    ║  4 ║ data_field ║ data_field ║ data_field  ║ 1369748936 ║
    ║  5 ║ data_field ║ data_field ║ data_field  ║ 1369748938 ║
    ║  6 ║ data_field ║ data_field ║ data_field  ║ 1369748939 ║
    ╚════╩════════════╩════════════╩═════════════╩════════════╝

我想要进行的是一个查询,从最高的time字段开始搜索,并且由于我知道它是从低到高排序的,所以当第一行不符合我的WHERE子句时,我希望它停止搜索,因为所有其他行也不会匹配它。我认为MySQL会搜索所有行,但由于我知道我的数据结构和我想要的数据的位置,所以我不需要搜索整个表。此外,如果我使用ORDER BY,我相信我的WHERE子句的所有内容将首先被执行,因此我将基本上搜索整个行集,然后对其进行排序。一个重要的事情是我不知道会检索多少行才能使用LIMIT子句。
以下是一个示例查询:
SELECT fields FROM table WHERE time > timestamp

我想获取从特定日期开始到现在的所有结果。

非常感谢您的帮助。


你尝试过使用由id和时间戳组成的双主键吗?在执行ORDER BY之前,务必首先执行WHERE语句,因为WHERE是O(n)操作(使用索引可以更快,参见:https://dev59.com/mGYr5IYBdhLWcg3w1NdY#13362951)。 - SubSevn
我认为你的意思是时间戳和ID(按照这个顺序),否则每一行仍然需要被搜索。 - mcNux
@Vinicius 这个问题解决了吗? - Anmol Gupta
@AnmolGupta,是的。这个问题已经解决了。经过一些研究,我发现Olivier Coilland给出的答案很有道理,所以我采用了它。 - Vinícius Barros
3个回答

2
您要求的是索引。我建议您研究一下B-Tree索引的工作原理。
如果在时间字段上建立了索引,引擎基本上会执行您所要求的操作 - 因为索引是有序的,它会“知道”它只需要找到您要求的最早时间点,并返回它之后的所有内容。

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html


2

只需在时间戳字段上添加索引,Mysql会为您处理。


1
我想做的是一个选择,从最高时间字段开始搜索,因为我知道它是按从低到高排序的,所以我希望在满足条件后停止搜索...
我真的不认为你可以告诉MySQL在满足某个条件后停止查询。
事实上,我真的不认为你应该关心这个。查询是数据库的工作,它做得很好。如果这是性能问题,你在很多世纪之前就不应该看到任何差异 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接