从数据库获取指定用户最新记录:两种ORM查询方式孰优孰劣?
两种Django ORM查询获取最新Tariff记录的性能对比
结论
两种查询方式性能完全等价,不存在谁更快的区别,但从代码可读性角度更推荐前者。
核心原因
底层SQL逻辑一致
Django ORM会把两种写法转换成逻辑等价的数据库查询:Tariff.objects.filter(user=user).order_by('-created_at').first()生成的SQL:SELECT ... FROM tariff WHERE user_id = %s ORDER BY created_at DESC LIMIT 1Tariff.objects.filter(user=user).order_by('created_at').last()生成的SQL:SELECT ... FROM tariff WHERE user_id = %s ORDER BY created_at ASC LIMIT 1
数据库执行这两条SQL的效率没有差异——无论排序方向是升序还是降序,本质都是定位指定用户的最新
created_at记录。索引是性能关键
两者的性能瓶颈完全取决于是否有合适的索引:- 如果在
Tariff表的(user, created_at)字段上创建复合索引,两个查询都会直接命中索引,瞬间返回结果; - 如果没有索引,两者都会触发全表扫描+排序操作,效率同样低下。
- 如果在
可读性建议
order_by('-created_at').first()的写法更直观,直接表达“按创建时间倒序取第一条(最新记录)”的业务意图,代码维护成本更低;而last()的写法需要额外理解“升序排序后取最后一条”的逻辑,可读性稍弱。
内容的提问来源于stack exchange,提问作者Roman Golubnikov
相关产品推荐
相关产品推荐

