dia*_*ks2 5 ruby performance ruby-on-rails ruby-on-rails-3
我有一个按特定顺序排序的模型.我的目标是从模型中找到一条记录,其中所有先前记录的特定列的总和等于某个数字.下面的例子告诉我我需要的东西,但它非常慢,特别是对于一个相当大的表.有没有更快的方法来解决product.id所有以前产品的积分总和= 100000?
total_points = 0
find_point_level = 100000
@products = Product.order("id").all
@products.each do |product|
total_points = product.points + total_points
@find_product = product.id
break if total_points >= find_point_level
end
Run Code Online (Sandbox Code Playgroud)
更新
以下是一些解决方案的一些时间.这通过大约60,000条记录.时间适用于ActiveRecord.
原始示例(上图):
2685.0ms
1238.8ms
1428.0ms
使用find_each的原始示例:
799.6ms
799.4ms
797.8ms
创建一个总和的新列:
181.3ms
170.7ms
172.2ms
您可以尝试对数据库进行非规范化,并将部分和直接保存在products
表中.简单查询,where
并立即limit
给你一个正确的答案.
您需要创建额外的过滤器,在添加产品时更新单个记录,以及在删除产品或points
更改字段时更新所有产品.
归档时间: |
|
查看次数: |
1537 次 |
最近记录: |