【问题标题】:design Optimized query in rails在 Rails 中设计优化查询
【发布时间】:2014-11-10 23:42:37
【问题描述】:

我在提高 Rails 中 rest api 的性能方面付出了很多努力。目前,rest API 需要 10 秒来获取 25000 条记录,其中每条记录的大小为 1 kb。

我正在努力通过优化查询、应用索引等来减少它。但目前没有任何效果。我是数据库新手,可能会错过一些愚蠢的观点。我想将时间减少到 1-2 秒。

这是我的架构文件,可以通过数据库结构来了解

 create_table "records", force: true do |t|
t.datetime "start"
t.datetime "end"
t.datetime "current"
t.integer  "user_id"
t.integer  "device_id"
t.datetime "created_at"
t.datetime "updated_at"
end

add_index "records", ["device_id"], name: "index_records_on_device_id", using: :btree
add_index "records", ["user_id"], name: "index_records_on_user_id", using: :btree

create_table "record_student", force: true do |t|
 t.string   "class_id"
t.string   "c_admin"
t.string   "Branch"
t.integer  "system_id"
t.integer  "asu"
t.decimal  "d_code",       precision: 10, scale: 0
t.integer  "c_code"
t.integer  "marks"
t.string   "stype"
t.integer  "record_id"
t.datetime "created_at"
t.datetime "updated_at"
 end

 add_index "record_student", ["record_id"], name: "index_record_student_on_record_id", using: :btree

create_table "record_emp", force: true do |t|
 t.string   "class_id"
t.string   "c_admin"
t.string   "Dept_name"
t.integer  "temp_id"
t.integer  "system_id"
t.integer  "asu"
t.decimal  "d_code",       precision: 10, scale: 0
t.integer  "c_code"
t.integer  "marks"
t.string   "stype"
t.integer  "record_id"
t.datetime "created_at"
t.datetime "updated_at"
 end

 add_index "record_emp", ["record_id"], name: "index_record_emp_on_record_id", using: :btree

create_table "record_other", force: true do |t|
t.integer  "d_code"
t.integer  "c_code"
t.integer  "code"
t.decimal  "marks",            precision: 10, scale: 0
t.string   "stype"
t.integer  "record_id"
t.datetime "created_at"
t.datetime "updated_at"
end

这是 sn-p 但与主模式非常相似。

我正在使用这个查询来访问记录,它需要

Records.owned_by(User.find_by_email(params[:user].to_s).id).where(device_id: params[:did]).includes(:record_students, :record_employees, :record_admins, :record_others)

结果为@​​987654323@ 我只是不明白为什么要花这么多时间,任何改进任何查询或任何其他点的建议

谢谢

【问题讨论】:

    标签: mysql ruby-on-rails database activerecord


    【解决方案1】:

    一个查询有 25000 个结果,这对每台服务器来说都是多余的。在尝试简化查询之前,您应该考虑一下您的解决方案。以下是一些建议:

    • 为您的结果添加分页,因此您无需查询数据库中的所有记录并将它们映射到 ActiveRecord 中的对象
    • 检查你不是在处理 N+1 查询,查看bullet 寻找线索
    • 简化查询:有时只有一个复杂的查询无助于解决性能问题
    • 只选择你需要的字段,看看pluck method

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 2013-02-18
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多