如何使这些活动记录查询更快



我正在使用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等

最新更新