2012-02-21 201 views
2

我目前有一個postgresql數據庫中的記錄每分鐘更新一次,這些記錄是用SQL語句過濾的。可以存在1000個不同的濾波器組合,每分鐘可以調用大約500個不同的濾波器。目前,http響應被緩存了59秒,以緩解服務器負載和數據庫調用。然而,即時考慮在memcached緩存整個數據庫表,並在php中進行過濾。 2000行不是很多,但從內存和數據庫獲取數據的響應時間會更快。數據庫與服務器端處理

php的處理時間會超過這個行數的sql過濾的數據庫響應時間嗎?在可預見的將來,餐桌不應超過3000行。

+0

我不會說我有一個願望在PHP中執行任務。如果我沒有得到性能好處,那麼我根本就沒有慾望。 – shapeshifter 2012-02-21 01:57:21

+0

@shapeshifter:你會想爲這個問題添加'memcached'標籤。另外,正如邁克爾所說,結果取決於你自己的環境。 – 2012-02-21 02:06:19

回答

4

與任何有關is x faster than y的問題一樣,唯一真正的答案是自己對它進行基準測試。但是,如果數據庫爲需要執行的查詢編制了適當的索引,那麼過濾結果集的速度可能會比大多數可編寫的任何PHP代碼快得多。

另一方面,RDBMS已經設計並優化了定位,過濾和排序行。

+3

另外,沒有理由不能給數據庫足夠的內存以將整個表保存在內存中。 – 2012-02-21 02:20:37

1

PostgreSQL運行的方式,如果你不是非常匱乏的內存,100%這樣一個小而頻繁查詢的表將被默認的緩存算法保存在RAM(緩存)中。使用數據庫引擎進行過濾幾乎肯定比在應用程序中執行相同的過程要快。

您可能要檢查你的postgresql.conf,尤其是shared_buffersplanner cost constants(設置random_page_cost幾乎或精確低至seq_page_cost)和effective_cache_size(設置足夠高)。

您可能會從優化索引中受益。有多種類型可供選擇。除了普通索引之外,還考慮partial indexes, indexes on expression or multi-column indexes。使用EXPLAIN ANALYZE進行測試,只保留實際使用的索引並加快查詢速度。由於所有表都駐留在RAM中,因此查詢計劃員應該計算出隨機訪問幾乎或完全像順序訪問一樣快。差異僅適用於光盤讀取。

當你更新的每一分鐘,一定保持實際上不幫助任何索引。另外,在這種情況下,經常進行抽真空和分析是性能的關鍵。不是VACUUM FULL ANALYZE,只是VACUUM ANALYZE。或者使用調諧設置的自動吸塵器。

當然,關於performance optimization的所有標準建議都適用。