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