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 关联;我在这里将它们称为Bar
和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 毫秒)。我对 bar
和 baz
调用进行了基准测试,发现它们分别花费了大约 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 关联缓慢的主要内容,如果未能解决你的问题,请参考以下文章
Rails 5:将belongs_to关联与自定义名称添加到模型和迁移
Rails ActiveRecord - 获取与锁定的belongs_to关联