Rails 3 中的Belongs_to 关联缓慢

Posted

技术标签:

【中文标题】Rails 3 中的Belongs_to 关联缓慢【英文标题】:Slow belongs_to associations in Rails 3 【发布时间】: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 毫秒似乎是通过主键加载记录的大量时间。 【参考方案1】:

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

【讨论】:

如果是这样的话,那么 MySQL 的查询时间会长得多,而且会占到更大的一块。但它的时钟是

以上是关于Rails 3 中的Belongs_to 关联缓慢的主要内容,如果未能解决你的问题,请参考以下文章

回调belongs_to关联rails

Rails 5:将belongs_to关联与自定义名称添加到模型和迁移

Rails ActiveRecord - 获取与锁定的belongs_to关联

如何在rails 4中创建新的belongs_to关联模型

如何测试 belongs_to 与 Rails 6 和 RSpec 4.1 的关联?

Rails Searchkick / Elasticsearch has_many 和 belongs_to 关联