Mysql 查询记录的最佳方式

Mysql 查询记录的最佳方式,mysql,sql,ruby-on-rails,ruby-on-rails-3,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 为计数器建立一个单独

我的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
  • 为计数器建立一个单独的数据库是否比通过记录进行搜索和计数更好
  • 您推荐/建议什么样的数据库结构

您可以尝试执行类似于支付的操作。选择('value')作为基本查询,以便您只执行一个查询并映射到该查询。

您可以尝试吗

@total\u payments+=p.payments.pull(:value).sum

这将仅从每次付款中选择
,而不是表中的所有字段。您的表是否在
付款
表中的
人员id
上建立索引?这也将有助于加快数据库的速度


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

假设
人员
是活动记录关系

persons.joins(:payments).sum(:value)
如果
persons
已经是一个数组(不太首选)


如果total payment是此视图中关联付款的唯一属性,则需要。然后最快的方法是在
person
表中设置
total\u payments
字段。每当进行相关的
付款时更新它。类似于计数器缓存的东西。那么您就根本不需要对付款进行sql查询。

什么是
人。每个人都是
?我想应该是
人。每个人都是
?此外,这是payments controller?请尝试在数据库中使用
迷你探查器
,查看事物如何访问数据库。您还可以对支付金额执行
Rails.cache.fetch
memcache
dahli | memcache
操作。这将增加您的记忆,但提供更快的体验。谢谢。我将尝试mini profiler,然后执行memcache
Payment.where(:person_id => persons.map(&:id)).sum(:value)