Rails数据库查询速度极慢

时间:2016-08-09 09:44:18

标签: ruby-on-rails database postgresql

我的应用程序目前有一个大约有1280万行的表,该表与另外5个表有has_one个关联,其中每个表都有相同的1280万行。

然后,所有这些数据将显示在使用filterrific gem的过滤功能的表格中。问题是,执行列特定搜索等查询需要花费太多时间,而Table.count查询需要大约30-40秒才能完成。是否存在可以大大缩短查询时间的查询优化方法?

我尝试过实施预先加载并选择只显示所需的列,但性能提升并不显着。

示例模式:

domain.rb

create_table "domains", force: :cascade do |t|
    t.string   "name",                                     null: false
    t.integer  "age",                      default: 0
    t.integer  "pr",                       default: 0
    t.boolean  "dmoz",                     default: false
    t.float    "price",                    default: 0.0
    t.string   "listing_type"
    t.datetime "created_at",                               null: false
    t.datetime "updated_at",                               null: false
    t.string   "source"
    t.datetime "end_date_time"
    t.integer  "no_bids",                  default: 0
    t.float    "traffic",                  default: 0.0
    t.float    "valuation",                default: 0.0
  end
add_index "domains", ["name"], name: "index_domains_on_name", unique: true, using: :btree

对于搜索过滤器,使用范围并在下面举例:

  scope :basic, lambda { |basic|
    query = ""
    query += "age BETWEEN #{check_min(basic.age_min.to_i)} AND #{check_max(basic.age_max.to_i)} " if basic.age_min.present? || basic.age_max.present?
    query += "AND price BETWEEN #{check_min(basic.price_min.to_f)} AND #{check_max(basic.price_max.to_f)} " if basic.price_min.present? || basic.price_max.present?
    query += "AND pr BETWEEN #{check_min(basic.pr_min.to_i)} AND #{check_max(basic.pr_max.to_i)} " if basic.pr_min.present? || basic.pr_max.present?
    if query[0..2] == 'AND'
      query = query[3..-1]
    end

    where(query)
  }

1 个答案:

答案 0 :(得分:0)

要获得近似行计数,请在SQL

中执行以下操作
SELECT reltuples AS approximate_row_count 
  FROM pg_class WHERE relname = 'domains';

现在您还没有提供生成的SQL或查询计划,所以这里有一些一般的建议可以帮助您。随着更多信息的出现,我可能会添加一些更具体的建议,但这有点受限。

SQL是一种声明性语言,这意味着我们告诉db我们想要什么,并尝试确保它能够快速完成。所以你想要做的是记录postgresql.conf中的慢语句(log_min_duration_statement),然后解释分析这些语句。如果没有查询计划,很难看出可能需要哪些索引。

查询计划基本上告诉您PostgreSQL在可用索引的情况下决定检索所需数据的最快方法。从那里你想要看看选择标准(即减少大多数行的方法)并在你意外地对大型表进行顺序扫描时对这些字段进行索引(顺序扫描通常更快,但是当你检索大约10%时(见表)。