2

Foo私はいくつかの属している関係を持つモデルを持っています。ここではそれらを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基礎となる MySQL ステートメントは非常に高速 (~0.5 ミリ秒) でしたが、異常に遅い (~4 秒) ことに気付きました。barとの呼び出しのベンチマークbazを行ったところ、Rails 関連付けコードを実行するだけで、それぞれ ~2.3 秒と ~221 ミリ秒かかることがわかりました。

次に、次のメソッドを入れます。

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 の目的を無効にします)。

だから、私は代替案を探しています:

  • 物事を遅くしている可能性のある間違ったことをしている可能性はありますか? (実際のコードは明らかにこれより複雑です。ただし、begs_to は正確です。実際のコードには追加のオプションはありません)。
  • 他の人はこれに遭遇しましたか?
  • 彼らはそれにどのように対処しましたか?
4

1 に答える 1

-1

クエリが異なり、問題はRailsではなく、DBにあるようです。たぶん、あなたは他の条件を持っていて、それらのインデックスを正しく持っていません。

于 2012-05-31T15:48:18.047 に答える