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

所以我想得到从给定日期到现在的所有结果。

非常感谢您的帮助。

4

3 回答 3

2

只需在时间戳字段上放置一个索引。Mysql 会替你处理的。

于 2013-05-28T13:11:10.660 回答
2

你要的是一个索引。我建议您对 b-tree 索引的工作原理进行一些研究。

如果你在时间字段上有一个索引,引擎基本上会做你所要求的——因为索引是有序的,它会“知道”它只需要找到你要求的最早点并返回之后的一切。

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

于 2013-05-28T13:07:59.563 回答
1

我想要做的是从最高时间字段开始搜索的选择,因为我知道它是从最低到最高排序的,所以我希望它在...时停止搜索

我真的不认为你可以告诉 MySQL 在满足某个条件后停止查询。

事实上,我真的认为你也不应该在意。查询是数据库工作,它做得很好。如果这是性能问题,那么直到几个世纪之前您都不会看到任何差异:)

于 2013-05-28T13:06:07.000 回答