查询记录的最佳方式

时间:2013-09-23 03:20:28

标签: mysql sql ruby-on-rails ruby-on-rails-3

我在使用rails应用程序时遇到了问题。这可能是数据库结构不佳的结果。考虑到记录是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
  • 为计数器设置单独的数据库比搜索和统计记录更好吗?
  • 您推荐/建议什么样的数据库结构?

3 个答案:

答案 0 :(得分:2)

假设persons是Activerecord关系

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

如果persons已经是一个数组(不太喜欢)

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

如果在此视图中,总付款是相关付款的唯一属性。然后,最快的方法是在total_payments表中使person成为一个字段。每当建立关联的payment时更新它。类似于计数器缓存的东西。然后你根本不需要为付款进行SQL查询。

答案 1 :(得分:0)

您可以尝试使用Payment.select('value')之类的内容作为基本查询,这样您只需执行一次查询并在其上进行映射。

答案 2 :(得分:0)

你能试试吗

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

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

(在移动设备上,因此无法深入了解)