2014-12-22 118 views
0

所以我正在和一些我的朋友一起開發一個Rails端項目,這需要加載很多種子數據。我有一個JSON文檔中的種子數據,它現在只包含3200個JSON對象,每個JSON對象具有相同的3個字段名稱。優化數據庫查詢軌跡

我已經解析並在Rails中植入了這些數據,爲每個JSON對象創建一個新記錄。我應該注意到該對象有幾個has_many關聯。

問題是,在我用JSON文件播種數據庫之後,當我試圖將所有3200條記錄加載到頁面中時(使用簡單的ModelName.all.each塊),加載時間很荒謬......約爲17826ms(17.8秒)。

根據控制檯,它說(Views: 16252.4ms | ActiveRecord 1522.9ms)。我研究過實現急切的加載和預加載(並且我仍然在努力)。

我的問題是,我怎樣才能進一步優化呢?我試過ModelName.preload(:associationName)預加載,但這似乎並沒有改變repsonse的時間(可能我做得不正確)。我腦子裏想的是3200條記錄不是很多...爲什麼這麼長時間?在項目的早期,像Redis那樣快速整合一些東西是否可行?

+0

更多信息,你把'ModelName.all.each'的看法? – tagCincy

+0

可以粘貼示例模型數據以及當您說ModelName.all時正在執行的查詢。也粘貼相關的型號代碼。 –

+0

@tagCincy'ModelName.all'是一個控制器變量,它在每個視圖中被調用。 – CisBae

回答

2

您可能有一個n+1問題,確定您獲取控制器中的所有對象,但在視圖中您正在訪問某些需要額外延遲查詢的關係,以解決您需要急切加載整個數據的問題,請使用includes關鍵字

@all_objects_with_associations = SomeObject.includes(:some_association).all 

另一個額外的級別將使用片段緩存,假設你不想分頁(如果您正在使用導軌4它是默認啓用),所有你需要做的就是在增加高速緩存塊模板頂部,以及所有您認爲需要高速緩存失效的變量

cache @all_objects_with_associations do 

爲了讓你可以查看以下鏈接

Eager loading in rails
Fragment caching in rails

1

這是真正殺死速度的觀點。渲染許多對象當然需要時間。您應該對數據進行分頁並一次顯示數量有限的數據。這將消除數據庫以及視圖的壓力。

使用「will_paginate」作爲分頁。

或者,您可以實現「垂直分頁」,即一旦頁面向下滾動到底部以獲取並追加更多結果,即可進行AJAX調用。

此外,我會看看視圖,並確保沒有通過它進行數據庫查詢。如果他們是,我會嘗試以急切加載消除它們或將它們以某種方式移動到控制器,即將數據已經發送到視圖並且不具有視圖獲取數據。

+0

這是一個非常好的觀點,我在考慮分頁和垂直延遲加載,非常感謝這個建議! – CisBae

1

除了分頁,您只能從數據庫中提取必需的字段,這將進一步提高您的性能。

因爲,你的觀點是消費的主要時間片,考慮以下因素:使用的諧音,輔助方法(簡化視圖邏輯)

  • 移動呈現到客戶端

    • (發送從服務器端JSON )
    • 增加高速緩存策略

    如果你可以發佈你的看法的一些細節,這將幫助我們提供更多個性化的幫助。