【问题标题】:Best way to Query Records查询记录的最佳方式
【发布时间】:2013-09-23 03:20:28
【问题描述】:

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

【问题讨论】:

  • 什么是person.each?我想应该是persons.each?除此之外,这是付款控制器吗?
  • 尝试在您的数据库中使用mini-profiler 以查看访问数据库的方式。您也可以使用Rails.cache.fetchmemcachedahli|memcache 支付金额。这会增加您的记忆力,但会提供更快的体验。
  • 谢谢。我会尝试 mini-profiler 然后做一个内存缓存

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


【解决方案1】:

假设persons 是一个Activerecord 关系

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

如果persons 已经是一个数组(不太推荐)

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

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

【讨论】:

    【解决方案2】:

    您可以尝试将 Payment.select('value') 之类的操作作为基本查询,这样您只需执行一个查询并对其进行映射。

    【讨论】:

      【解决方案3】:

      你可以试试

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

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

      (在移动自动取款机上,因此无法深入了解)

      【讨论】:

        猜你喜欢
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多