【问题标题】:How to get the first row ever recorded in a table without sorting in MySQL?如何在没有在 MySQL 中排序的情况下获取表中记录的第一行?
【发布时间】:2018-08-08 00:35:34
【问题描述】:

假设您有一个包含 n 行的表,那么在不排序的情况下获取该表上记录的第一行的最有效方法是什么?

这保证有效,但随着记录数量的增加会变慢:

SELECT * FROM posts ORDER BY created_at DESC LIMIT 1;

更新:

如果有多个记录具有相同的created_at 值,这会更好,但仍需要排序:

SELECT * FROM posts ORDER BY id ASC LIMIT 1;

想象一个有 100 万页和 10 亿行记录的分类帐簿,要获得有史以来的第一个记录,您只需翻到第一页并获得最上面的那个,对吗?无论分类帐的大小如何,您都应该以相同的效率获得第一个记录。我希望我可以在 MySQL 中做同样的事情,而无需进行任何排序或排序。出于研究目的。我的意思是,为什么不呢?为什么不能 MySQL?设计上不可能吗?

这在编程中的典型数组结构中是可能的:

array = [1,2,3,4,5]

第一个元素在array[0],第二个在array[1],以此类推。不需要排序。最后一个元素是array[array_count(array)-1]

【问题讨论】:

  • 这可能是最快、最简单的方法。附带问题:如果两条记录具有相同的时间戳,您希望发生什么?
  • 您可以使用带有MAX() 的子查询,但这也会涉及类似于排序的过程。
  • 使用自增主键,选择id = 1,因为主键是索引的,所以不必对整个表进行排序
  • @Tim Biegeleisen 如果您在列上创建索引,该问题将得到解决
  • 这是记录的最后一行。

标签: mysql database sorting


【解决方案1】:

我可以提供以下两个查询来查找最近的记录:

SELECT * FROM posts ORDER BY created_at DESC LIMIT 1

SELECT *
FROM posts
WHERE created_at = (SELECT MAX(created_at) FROM posts

随着表变大,这两个查询的性能都会下降,因为查找最近创建日期所需的排序操作会花费更多时间。

但在这两种情况下,添加以下索引应该会提高查询的性能:

ALTER TABLE posts ADD INDEX created_idx (created_at)

MySQL 可以在ORDER BY 子句和查找最大值时使用索引。请参阅documentation 了解更多信息。

【讨论】:

  • 谢谢@tim,这是一个非常好的解决方案。但我希望有某种方式,也许是一种超低级的方式可以在 MySQL 的核心中完成。我可能无法得到那个答案,但我想在找到真正的答案之前不回答这个问题。也许某些核心开发人员会确认在未来的某个时候这是不可能的。
  • @doncadavona 事实上,我脑子里突然出现了一些东西。如果你真的想记录第一行,你可以设置一个触发器,假设目标表完全为空,它会复制第一条插入的记录。
  • 这意味着我们需要跟踪每条记录,这将使我们的记录翻一番,从 10 亿增加到 20 亿。假设我们在数据库中记录每条记录的存储顺序。此外,每次添加和删除记录时都必须重新索引整个表。太贵了。这实际上不仅仅是关于第一条记录,第一条记录只是我们在整个表的顺序中的指南。就像我们有一个 a=[1,2,3,4,5] 的数组时,第一条记录是 a[0]。第二个是 a[1],依此类推。没有排序或任何东西。
  • 你想要赏金还是什么?
  • 不,这次不行。我只是好奇,想知道它之前是否有一个快速/明显的答案。但是感谢您的 cmets 和回答!
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 2013-08-22
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
相关资源
最近更新 更多