【问题标题】:Search mysql table starting from last row从最后一行开始搜索mysql表
【发布时间】:2013-05-28 13:00:42
【问题描述】:

所以,我知道关系数据库中没有“最后一行”之类的东西,但我找不到更好的词来解释我想要做什么。我有一个如下所示的表,其中idAUTO_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


【解决方案1】:

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

如果您在时间字段上有一个索引,那么引擎基本上会按照您的要求执行 - 由于索引会被排序,它会“知道”它只需要找到您要求的最早点for 并返回它之后的所有内容。

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

【讨论】:

    【解决方案2】:

    只需在时间戳字段上放置一个索引即可。 Mysql 会帮你搞定的。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-03-25
        • 2018-01-12
        • 2021-08-30
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 2019-04-08
        • 1970-01-01
        相关资源
        最近更新 更多