【问题标题】:What's the most efficient way to select the last n rows in a table without changing the table's structure?在不更改表结构的情况下选择表中最后 n 行的最有效方法是什么?
【发布时间】:2017-01-31 15:52:53
【问题描述】:

使用 mySQL 选择表中最后 n 行的最有效方法是什么?该表包含数百万行,并且在任何给定时间我都不知道该表有多大(它在不断增长)。该表确实有一列会自动递增并用作每一行的唯一标识符。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    SELECT * FROM table_name ORDER BY auto_incremented_id DESC LIMIT n
    

    【讨论】:

      【解决方案2】:

      实际上按顺序获取最后 n 行的正确方法是使用子查询:

      (SELECT id, title, description FROM my_table ORDER BY id DESC LIMIT 5) 
      ORDER BY tbl.id ASC
      

      因为我知道只有这种方式才能以正确的顺序返回它们。接受的答案实际上是“从按 ID 降序排序的集合中选择前 5 行”的解决方案,但这很可能是您需要的。

      【讨论】:

      • 也许晚了,但我刚刚从here 发现,您可以简单地省略外部选择和别名,只需要:(SELECT * FROM table ORDER BY id DESC LIMIT 50) ORDER BY id ASC; 尽管读起来可能有点混乱。
      • @DiegoDD 真的很简洁,比我的解决方案要好得多,而且不会那么混乱,我会将其添加到我的答案中:)
      【解决方案3】:

      (类似于“marco”的回答,)
      我最喜欢的也是 MySQL 的 max()-function,在一个简单的 one-liner 中,但还有其他方法可以确定:

      SELECT whatever FROM mytable WHERE id > (SELECT max(id)-10 FROM mytable);
      

      ...你会得到“last id minus 10”,通常是该表的最后 10 个条目。

      这是一种简短的方法,不仅可以避免出现错误 1111(“无效使用组函数”),而且不仅存在 auto_increment-row(此处为 id)。
      max() 函数有多种使用方式。

      【讨论】:

      • 我用超过一百万个结果的表格对所有响应进行了基准测试,这种方式是最快的。实际上比按 ID 排序快 10 毫秒。
      【解决方案4】:

      也许按唯一 id 降序排列:

      SELECT * FROM table ORDER BY id DESC LIMIT n
      

      唯一的问题是您可能希望以不同的顺序进行选择,而这个问题使我不得不通过计算行数来选择最后一行,然后使用 LIMIT 选择它们,但显然这可能不是在您的情况下是一个很好的解决方案。

      【讨论】:

        【解决方案5】:

        使用 ORDER BY 以 DESC 顺序按标识符列排序,并使用 LIMIT 指定所需的结果数。

        【讨论】:

          【解决方案6】:

          如果你经常要做的事情,你可能还想添加一个降序索引(或在 mysql 中调用的任何东西)以加快选择速度。

          【讨论】:

            【解决方案7】:

            当您有大桌子时,这会快很多,因为您不必订购整张桌子。 您只需使用 id 作为唯一的行标识符。 当您在某些列中有大量数据作为图像(例如 blob)时,这也更有效。在这种情况下,排序可能非常耗时且耗费数据。

            select * 
            from TableName 
            where id > ((select max(id) from TableName)-(NumberOfRowsYouWant+1)) 
            order by id desc|asc
            

            唯一的问题是如果您在所需的时间间隔内删除行。在这种情况下,您不会得到真正的“NumberOfRowsYouWant”。

            当您需要在多个网页中向后显示表格时,您还可以轻松地使用它为每个页面选择 n 行,只需将 (NumberOfRowsYouWant+1) 乘以页码即可。

            【讨论】:

              【解决方案8】:

              您可以根据需要更改表名和列名。如果您想显示最后 10 行,则根据您的要求输入 n=10,或 n=20,或 n=30 ...等。

              选择 * 来自 (从员工中选择 * 按 emp_id desc limit n) 排序 emp_id asc 的订单;

              【讨论】:

                猜你喜欢
                • 2020-12-05
                • 2015-10-22
                • 1970-01-01
                • 1970-01-01
                • 2021-04-27
                • 2017-05-08
                • 2016-04-19
                • 1970-01-01
                • 2017-09-14
                相关资源
                最近更新 更多