代码中的
我正在使用Active Record向postgres数据库发送一些查询。
我有一个User模型,一个Business模型和一个名为UserBiz的joiner。
我提到的查询会遍历整个UserBiz集合,然后筛选出与用户提供的类别和搜索相匹配的业务。
if !params[:category].blank?
dataset = UserBiz.all.includes(:business, :user).select{|ub| (ub.business.category.downcase == params[:category].downcase) }
else
dataset = UserBiz.all.includes(:business, :user)
end
if !params[:search].blank?
dataset = dataset.select{|ub| (ub.business.summary.downcase.include? params[:search].downcase) || (ub.business.name.downcase.include? params[:search].downcase) }
end
这些";工作;但问题是,当我向数据库中投入25万个UserBiz来查看会发生什么时,一次搜索或类别更改需要15秒。如何使这些查询更快?
select
将所有内容加载到内存中,这在处理大量记录时对性能非常不利。
你必须在数据库中进行过滤,用这样的方法。
UserBiz
.includes(:business, :user)
.where("LOWER(businesses.category) = LOWER(?)", params[:category])
它很慢,因为您从UserBiz中选择了所有数据。尝试分页。分页、will_paginate等