【发布时间】:2020-04-28 14:58:48
【问题描述】:
我有一个带有 Postgres 10 数据库的 Rails 5 应用程序。我试图弄清楚这样做是否存在性能差异
MyModel.order(:created_at).last
对
MyModel.order(:created_at => :desc).first
我在“created_at”列上没有索引——它与我第一次从 Rails 迁移创建表时自动生成的索引相同。
【问题讨论】:
-
如果你需要对 1 亿行进行排序,我相信 Postgres 会更快。如果只需要排序 100 行,我认为不会有太大区别
-
升序排序抓取最后一条记录与降序排序抓取第一条记录有区别吗?
-
这将取决于你如何抓住最后一个。你能不通过第一个旋转直接得到它。同样,@a_horse_with_no_name 表示这取决于音量。然而,更好的方法是让 SQL 完成所有工作。消除 WHERE 子句中尽可能多的行,降序排序,限制为 1。然后只返回所需的单行。一般来说,在sql中做尽可能多的工作。
-
@Belayer,您说“这将取决于您如何抓取最后一个”,但我的印象是 Rails "MyModel.order(:created_at).last" 构造可以抓取对我来说,我无法控制。
-
我不知道,我不使用 Rails。我会将查询更改为仅返回一行(除非其余数据有其他用途)。看着你的陈述出现 Rails 正在做排序(但它可能会生成一个 order by)。随着数据量的增长,Rails 排序的时间和将数据从数据库服务器传输到它的时间都会变慢。
标签: postgresql performance ruby-on-rails-5 sql-order-by