2

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

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 毫秒)。我对barandbaz调用进行了基准测试,发现它们分别花费了大约 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 关联似乎非常低效,但我真的不想替换所有关联(这违背了大量 ActiveRecord 的目的)。

所以,我正在寻找替代品:

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

1 回答 1

-1

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

于 2012-05-31T15:48:18.047 回答