私のアプリは現在、約1280万行のテーブルを持っていて、そのテーブルはhas_one
という別の5つのテーブルと関連付けられています。Railsのデータベースクエリが極端に遅い
これらのデータはすべて、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)
}
スキーマとその検索方法に関する詳細情報を提供できますか?あなたがより良い/より良いインデックスを必要とするように聞こえるが、詳細がなければ、何がスピードアップするかは言い難い。 – rdubya
最適化したいのですか?テーブルのサイズを考えると、カウントに十分な近似値ですか? –
ねえ、私はいくつかの追加の詳細を追加しました。可能であれば、カウントとクエリの両方をスピードアップしたいと思います。 @ChrisTraversは時間を大幅に短縮すれば、おおよその値で十分でしょう。どのようにして近似値を得ることができますか? –