2017-04-25 75 views
0

我想使用Python Django將一些測量數據存儲到我的postgresql數據庫中。 到目前爲止,我已經用django製作了一個docker容器,而另一個用了postgresql服務器。 但是,我在我的測量表中接近2M行,並且查詢開始變得非常慢,而我不確定爲什麼,我沒有做非常激烈的查詢。PostgreSQL查詢速度慢,有什麼問題?

此查詢

SELECT ••• FROM "measurement" WHERE "measurement"."device_id" = 26 ORDER BY "measurement"."measure_timestamp" DESC LIMIT 20 

例如僅需數秒3和5之間運行,這取決於我查詢的設備。

我預計這會跑得快很多,因爲我沒有做任何幻想。 測量表

id INTEGER 
measure_timestamp TIMESTAMP WITH TIMEZONE 
sensor_height INTEGER 
device_id INTEGER 

帶有id和measure_timestamp索引。 服務器看起來不太忙,即使它只有512M的內存,在查詢過程中我還剩下很多。

我配置了postgresql server shared_buffers = 256MB和work_mem = 128MB。 總數據庫只有100MB以下,所以它應該很容易適合。 如果我在PgAdmin中運行查詢,我看到很多Block I/O,所以我懷疑它必須從磁盤讀取,這顯然很慢。

任何人都可以給我正確的方向幾點如何找到問題?

編輯: 在查詢中添加解釋分析的輸出。我現在在device_id上​​添加了索引,這對我有很大的幫助,但是我希望查詢時間更快。 https://pastebin.com/H30JSuWa

+4

在查詢上運行'EXPLAIN(ANALYZE,BUFFERS)',並將結果添加到您的問題中。這將有助於給出一個不僅基於猜測的答案。 –

+0

另外:將表定義添加到您的問題,包括PK FK和索引。還有一些數據的描述,比如基數。 – joop

回答

1

您有indexesmeasure_timestampdevice_id?如果查詢總是採取這種形式,您可能還喜歡multi-column indexes

+0

嗯,我以爲我做了,但顯然不在device_id上​​,所以我修正了這個問題,它幫了很大忙,但我還沒有,我認爲它可以快得多。 – Marcovannoord

+0

您的查詢通過desc訂購。你想嘗試以同樣的方式創建索引嗎? https://www.postgresql.org/docs/current/static/indexes-ordering.html – Jayadevan

+0

這樣做的竅門,以及答案中提到的其他事情。我不知道索引是「單向」,我可以索引他們降序。 Querytime從5秒變爲22ms。謝謝! – Marcovannoord

1

請看錶格的分配鍵。數據可能稀少,因此會影響性能。當您有2M記錄的數據時,選擇合適的分配鍵非常重要。有關更多詳細信息,請參閱on why distribution key is important