【问题标题】:Is it faster to have Rails or Postges do sorting?让 Rails 或 Postgres 进行排序会更快吗?
【发布时间】: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


【解决方案1】:

两个命令向 PostgreSQL 询问相同数量的工作
看两个命令的 SQL 就很明显了

MyModel.order(:created_at).to_sql
=> "SELECT \"my_model\".* FROM \"my_model\" ORDER BY \"my_model\".\"created_at\" ASC"

MyModel.order(created_at: :desc).to_sql
=> "SELECT \"my_model\".* FROM \"my_model\" ORDER BY \"my_model\".\"created_at\" DESC"

这两个命令都要求 PostgreSQL 对所有具有 created_at 列值的行进行排序。
所以两个命令没有区别

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多