ruby-on-rails - 寻找更快的 ActiveRecord 查询 (Ruby on Rails)

标签 ruby-on-rails ruby ruby-on-rails-3 performance

我有一个按特定顺序排序的模型。我的目标是从模型中找到一条记录,其中所有先前记录的特定列的总和等于某个数字。 下面的例子得到了我需要的东西,但速度很慢,尤其是对于一个相当大的表。有没有更快的方法来解决 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

更新

下面是一些解决方案的一些时间。这将通过大约 60,000 条记录。时间用于 ActiveRecord。

原始示例(上图):
2685.0毫秒
1238.8毫秒
1428.0毫秒

使用 find_each 的原始示例:
799.6毫秒
799.4毫秒
797.8 毫秒

用总和创建一个新列:
181.3毫秒
170.7毫秒
172.2毫秒

最佳答案

您可以尝试对数据库进行反规范化,并将部分总和直接保存在 products 表中。使用 wherelimit 的简单查询将立即返回正确的答案。

您需要创建额外的过滤器,它会在添加产品时更新单个记录,并且在产品被删除或它的 points 字段发生更改时更新所有产品。

关于ruby-on-rails - 寻找更快的 ActiveRecord 查询 (Ruby on Rails),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430491/

相关文章:

ruby-on-rails - 如何通过 order、find、where 等调用来保持反向关系?

javascript - 如何在 ruby​​ 中使用 javascript 中的变量?

ruby - 舍去小数点

ruby-on-rails - 使用哪个 gem : emberjs-rails vs rasputin vs ember-rails?

ruby-on-rails - 如何在 Rails 中处理 YouTube 的缩略图?

html - 使用css对齐字符串中不同大小的字符

ruby-on-rails - Rails 迁移 - self.up 和 self.down 有什么意义

ruby - `require "ruby​​gems "` returning ` false` 可以吗?

ruby-on-rails - Ruby on Rails 中的 Fields_for 方法

ruby-on-rails-3 - 如何避免将 rails 3 应用程序保存在 development.log 中?