2

我有幾個belongs_to的關聯的模型Foo;我在這裏將它們稱爲BarBaz。因此,該模型是這樣的:慢belongs_to的關聯中的Rails 3

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協會似乎是效率低下的窘況,但我真的不希望有更換他們的所有(即失敗的ActiveRecord的顯著量的目的)。

所以,我在尋找替代品:

  • 是否有東西,我可能做錯了多數民衆贊成速度變慢? (真正的代碼顯然比這更復雜,但是belongs_to是準確的;實際代碼沒有額外的選項)。
  • 有其他人遇到過嗎?
  • 他們是怎麼處理的?
+1

我不能說我以前見過這樣的事情。 754 ms看起來像是通過主鍵加載記錄的大量時間。 –

回答

-1

好像你有不同的查詢,問題不是出在軌,但在DB。 也許你有其他的條件,你沒有正確的索引。

+0

如果是這種情況,那麼MySQL查詢時間將會更長,並且會慢得多。但它在<1ms的時鐘內。 –

相關問題