如何在没有MySQL排序的情况下获取表中记录的第一行?

时间:2017-08-22 10:16:25

标签: mysql database sorting

假设你有一个包含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]

1 个答案:

答案 0 :(得分:2)

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

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