【问题标题】:Slow belongs_to associations in Rails 3Rails 3 中的Belongs_to 关联缓慢
【发布时间】:2012-05-25 18:04:08
【问题描述】:

我有一个模型Foo 有几个belongs_to 关联;我在这里将它们称为BarBaz。所以模型看起来像这样:

class Foo
  belongs_to :bar
  belongs_to :baz

  def do_stuff_with_bar_and_baz
    bar.do_stuff(baz)
  end
end

我们注意到do_stuff_with_bar_and_baz 异常缓慢(约 4 秒),尽管底层 MySQL 语句非常快(约 0.5 毫秒)。我对 barbaz 调用进行了基准测试,发现它们分别花费了大约 2.3 秒和大约 221 毫秒……只是为了通过 Rails 关联代码。

然后我输入了以下方法:

class Foo
  belongs_to :bar
  belongs_to :baz

  def bar
    Bar.find(self.bar_id)
  end

  def baz
    Baz.find(self.baz_id)
  end

  def do_stuff_with_bar_and_baz
    bar.do_stuff(baz)
  end
end

这会绕过 ActiveRecord 关联代码并直接加载关联的记录。使用此代码,加载 do_stuff_with_bar_and_baz 中的 Bar 和 Baz 的时间分别下降到 754ms 和 5ms。

这令人沮丧。标准的 Rails 关联似乎非常低效,但我真的不想替换 all 它们(这违背了大量 ActiveRecord 的目的)。

所以,我正在寻找替代方案:

  • 是否有一些我可能做错的事情会减慢速度? (实际代码显然比这个复杂。但是,belongs_to 是准确的;实际代码没有额外的选项)。
  • 其他人遇到过这种情况吗?
  • 他们是如何处理的?

【问题讨论】:

  • 我不能说我以前见过这样的事情。 754 毫秒似乎是通过主键加载记录的大量时间。

标签: ruby-on-rails performance ruby-on-rails-3.1 associations


【解决方案1】:

似乎您有不同的查询,问题不在 Rails 中,而在 DB 中。 也许您还有其他条件,但您没有为它们设置正确的索引。

【讨论】:

  • 如果是这样的话,那么 MySQL 的查询时间会长得多,而且会占到更大的一块。但它的时钟是
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多