2017-04-26 40 views
2

我在Postgresql數據庫中有user表,如果運行User.count,則需要150ms才能得到結果。它對我們來說太慢了。理想情況下,返回結果應不到10ms。有沒有什麼辦法可以緩存sql結果model level?喜歡的東西Rails獲取表記錄的最快途徑

def self.total_count 
    User.count.cached # that's my imagination 
end 
+1

這是關於Postgresql比Rails更多的東西。 Postgres提供ACID屬性的方式有許多優點,但缺點是需要進行表掃描才能獲得精確的行數。其他數據庫可以在非常小的恆定時間內返回一個計數。在另一個表中維護一個單獨的計數會產生一個糟糕的性能瓶頸,但是如果插入和刪除很少,那可能就沒有問題。 counter_cache只是一個Rails的實現。但使用它來保持整個表的大小將會很奇怪。 – Gene

回答

6

在我看來,有幾種方法,你可以去了解這一點 -

  1. 可能您通過遞增那裏,當計數存儲用戶總數的計數另一個表用戶被添加/刪除或頻繁的時間間隔。
  2. 如果您的表格非常大並且精度不是最重要的,那麼您還可以查看Postgres的'COUNT ESTIMATE查詢。

    SELECT reltuples AS approximate_row_count FROM pg_class WHERE relname = 'users';