2013-09-23 57 views
0

我遇到了我的导轨应用程序的性能问题。这可能是一个糟糕的数据库结构的影响。并且该页面经常被用户查看,考虑到该记录是5k +。查询记录的最佳方式

Current System: 

Model: 
person has_many payment 

Controller: 
@total_payments = 0 
person.each do |p| 
    @total_payments += p.payments.map(&:value).sum 
end 

View: 
@total_payments 
  • 是更好地对不是通过记录搜索和计数的计数器一个单独的数据库?
  • 你推荐什么databse结构/建议?
+0

什么是'person.each'?我想它应该是'persons.each'?此外,这是支付控制器? –

+1

尝试在数据库中使用'mini-profiler'来查看事物如何访问数据库。您也可以执行“Rails.cache.fetch”和“memcache”或“dahli | memcache”付款金额。这会增加你的记忆力,但提供更快的体验。 – kobaltz

+0

谢谢。我会尝试mini-profiler然后做一个memcache – fujisan

回答

2

假设persons被一个ActiveRecord关系

persons.joins(:payments).sum(:value) 

如果persons是一个数组已经(不太优选的)

Payment.where(:person_id => persons.map(&:id)).sum(:value) 

如果总在此视图中,付款是唯一需要关联付款的属性。那么最快的方法是在person表中做total_payments一个字段。只要建立关联的payment,就更新它。类似于计数器缓存。那么你根本不需要为支付做一个sql查询。

0

你可以尝试像Payment.select('value')那样做一个基本查询,这样你只需要做一个查询和映射就可以了。

0

你能尝试

@total_payments += p.payments.pluck(:value).sum

这样只会选取从每一笔支出,而不是表中的所有字段value。您的表格是否在Payment表中的person_id上索引?这也有助于加快数据库的速度。

(上移动ATM所以不能下潜更深)