2017-01-14 166 views
0

我正處於一個新的寵物項目MVP的最後階段......並試圖改善查詢時間。Rails - 優化數據庫查詢

我的主表目前有大約150萬條記錄...並且預計將增長到超過100萬...甚至可能還有1000萬個以上。這些記錄屬於可以被用戶阻止的父項。當父母被阻止時,孩子在任何視圖中都不應再顯示,直到父母被解除封鎖。用戶可以有100以上的受阻父母向上...

目前,我有收到封鎖parent_ids數組的範圍...

scope :parent_filter, ->(parent_ids) { where.not(parent_id: [*parent_ids]) } 

的PARENT_ID在子表索引。

這導致查詢時間約250-350ms .... 有沒有更好的方法來做到這一點?我在想也許是一個3路加入父母和parent_child表可能會更好......但不確定。

如果它有所作爲,我現在在$ 7 Dyno & $ 9 Postgres現在... 任何幫助,將不勝感激!

回答

1
在大多數情況下

所有你需要做的是落實數據庫索引

如果你已經這樣做了:

這聽起來題外話,但根據我的經驗,緩慢查詢的90%可以通過應用程序級別緩存(尤其是模型緩存和俄羅斯娃娃緩存)來解決

根據我的經驗(例如,和很多其他Rails開發的經驗從peopele邀請發言Ruby Rouges podcast)是你可以花幾個星期優化SQL查詢,你所需要做的只是緩存複雜的Web應用程序的一部分。

更新

還請「物化視圖」 https://www.sitepoint.com/speed-up-with-materialized-views-on-postgresql-and-rails/也可能提振PosgreSQL速度

+0

嘿嘿,PARENT_ID被索引....和我有我使用盡可能多的視圖緩存已經能夠找出 - 只有視圖/俄羅斯娃娃緩存到目前爲止...我的應用程序需要現在得到參數...哪些不能很好地與緩存... 我經歷了很多你在這個項目中早些時候描述......並且確實有很大的幫助......當加載主對象索引頁面時,只有一個查詢似乎很慢,espec隨着該範圍的參與。 – tkz79

+0

沒有這個範圍: 加載(163.8ms) 加上它: 加載(224。9ms) 我當時希望能在9美元的Heroku數據庫(它似乎沒有內存),這是怪罪......但每次我想到目前爲止,事實證明我是這樣做的不做/做錯了。 – tkz79

+0

我錯過了我的默認排序列的索引....謝謝你好心情! – tkz79