현재 내 앱에 약 1280 만 개의 행이있는 테이블이 있고이 테이블의 각 행에 1280 만 개의 행이있는 다른 5 개의 테이블과의 연결은 has_one
입니다.레일스의 데이터베이스 쿼리 속도가 매우 느림
그런 다음이 모든 데이터는 filterrific
보석을 사용하여 필터링 기능이있는 테이블에 표시됩니다. 문제는 열 특정 검색과 같은 쿼리를 수행하는 데 너무 많은 시간이 걸리는 반면 Table.count
쿼리는 완료하는 데 약 30-40 초가 걸리는 것입니다. 쿼리 시간을 크게 줄일 수있는 쿼리 최적화 방법이 있습니까?
나는 열심히로드를 구현하고 표시하는 데 필요한 열만 선택했지만 성능 향상은 중요하지 않았습니다.
예 스키마 :
검색 필터
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
은 범위가 사용되는 domain.rb 아래 예 :
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는 시간을 크게 줄이면 대략적인 값이면 충분합니다. 방법으로 대략적인 값을 얻으려면 어떻게해야합니까? –