【发布时间】:2013-05-28 13:00:42
【问题描述】:
所以,我知道关系数据库中没有“最后一行”之类的东西,但我找不到更好的词来解释我想要做什么。我有一个如下所示的表,其中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) 操作(索引更快,请参阅:stackoverflow.com/a/13362951/431415)。
-
我认为您的意思是时间戳和 ID(按此顺序),否则,仍然需要搜索每一行。
-
@Vinicius 这个问题解决了吗?
-
@AnmolGupta,是的。这个问题就解决了。经过一番研究,我发现 Olivier Coilland 给出的答案是有道理的,我就去做了。
标签: mysql sorting optimization