You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从数据库获取指定用户最新记录:两种ORM查询方式孰优孰劣?

两种Django ORM查询获取最新Tariff记录的性能对比

结论

两种查询方式性能完全等价,不存在谁更快的区别,但从代码可读性角度更推荐前者。

核心原因

  1. 底层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 1
      
    • Tariff.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记录。

  2. 索引是性能关键
    两者的性能瓶颈完全取决于是否有合适的索引:

    • 如果在Tariff表的(user, created_at)字段上创建复合索引,两个查询都会直接命中索引,瞬间返回结果;
    • 如果没有索引,两者都会触发全表扫描+排序操作,效率同样低下。

可读性建议

order_by('-created_at').first()的写法更直观,直接表达“按创建时间倒序取第一条(最新记录)”的业务意图,代码维护成本更低;而last()的写法需要额外理解“升序排序后取最后一条”的逻辑,可读性稍弱。

内容的提问来源于stack exchange,提问作者Roman Golubnikov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:17:01