2014-02-09 135 views
0

我得到一個PHP的Web應用程序,其中Postgres數據庫,其中獲取大量的查詢第二(300-600)。數據庫服務器效率不高,所以我得到很多查詢超時。 是否有任何機制會在數據庫上運行它們之前創建查詢隊列? 我認爲這是下面的一個進程/守護進程這需要即50個查詢從隊列,運行這些數據庫,等待所有完成並獲得下一個50個查詢等PostgreSQL數據庫查詢隊列mechanizm(PHP)

回答

3

是否有任何機制,以使一個查詢在交易池模式可以排隊發言PgBouncer - 運行它們的數據庫

是前排隊。

儘管您很可能只需要調整數據庫服務器並處理性能不佳的查詢。退房pg_stat_statements,auto_explain,explain analyze等。請閱讀the wiki article on connection countsslow queries

如果可能的話,修復您的客戶端應用程序,以便減少每個執行更多工作的查詢 - 執行設置操作

對於寫入操作(插入/更新/刪除)將它們批量處理成事務,並且如果可能的話,運行更少的語句來執行更多的工作。特別是,不要在可能的情況下遍歷SQL語句。

如果必須使用大量的小寫的,看設置commit_delay或者(如果你能接受的數據丟失窗口)設置爲synchronous_commit = off不太重要的寫操作。

如果您的查詢主要是讀取,我強烈建議引入一個像Redis內存中鍵/值存儲或Memcached的中級緩存。讓您的應用程序管理此緩存,以避免重複獲取不一定非常新鮮的數據,或者速度不會超快。您可以使用PostgreSQL的LISTEN和NOTIFY功能來實現細粒度緩存失效。

+0

感謝您的回覆。 我剛剛發現這個: http://kr.github.io/beanstalkd/ 是否有人用它將查詢排入數據庫?這是個好主意嗎?文檔很差。 –

+0

@ZiomZiomalski如果你正在尋找一個實際的排隊系統,對於消息隊列來看看ZeroMQ,ActiveMQ,Celery等等等等等等等。不太清楚任務隊列,我不需要處理它們,但是看到http: //queues.io/。另外,請閱讀http://mikehadlow.blogspot.com.au/2012/04/database-as-queue-anti-pattern.html。 –

+0

@ZiomZiomalski另外,考慮發佈一個更好的框架問題:「這是我的應用程序所做的,這裏是它運行的查詢,這是爲什麼它這樣做,這是它導致的性能問題,還有更好的方法嗎?」。包括PostgreSQL版本,像max_connections這樣的關鍵參數,你的應用正在執行的任務的描述,如何觸發這個任務,你對結果做什麼等。 –