2014-10-31 53 views
1

做與時間戳字段「創建」數據庫索引以下的簡單數據庫查找時間比做同樣的查找上的Elasticsearch索引更長10倍(保持相同的數據):爲什麼從Elasticsearch中檢索數據比PostgreSQL快得多?

SELECT * FROM "my_table" ORDER BY "created" DESC LIMIT 1000 OFFSET 200000 

沒有過濾器,在這個查詢中沒有文本搜索 - 這是一個簡單的查找與高偏移量。使用較低的偏移量可以爲PostgreSQL和Elasticsearch產生同樣快速的結果。偏移量越大,時間差越大。甚至在沒有訂購結果的情況下,使用較大的偏移量也需要比ES更長的時間。

這是正常的,或者可以在PostgreSQL中有一個選項設置不正確嗎?一般來說,數據庫表現非常好,並且在高流量的網站上使用。

回答

2

偏移量越大,服務器需要計算的行越多,因此,使用的偏移量越高,查詢效率越低。

Postgres doclimit/offset警告:

忽略的行的偏移​​子句還是要內 服務器來計算;因此一個大的OFFSET可能效率不高。

查詢計劃對於一個較小的OFFSET而言是什麼樣的?

根據具體用途 - 比如,如果你的服務器上做後端的工作 - 你可以使用光標而不是做與LIMITOFFSET一系列SELECT S的,雖然用戶面對事件和其他無狀態連接的情況 - 即分頁 - 這可能不是一種選擇。

+0

這是一個徹底的解釋 - 謝謝!那麼,沒有設置標誌或任何東西?這是一個Django應用程序,這是Django的paginator默認使用的查詢。那麼,繼續使用Elasticsearch來執行此類操作似乎更有效。 – 2014-11-01 07:40:44

+0

當然,沒問題。沒有專門針對此的標誌,但可能可以調整* Postgres *服務器的配置以更好地執行整體操作。有關更多信息,請參閱[此鏈接](https://wiki.postgresql.org/wiki/Performance_Optimization)。 – khampson 2014-11-02 04:01:08

+0

如果你想用PostgreSQL進行快速分頁,那麼你需要使用一個值作爲你的偏移量,例如, ''created>'2015-06-09'''。也就是說,請提供您在每個頁面上顯示的最新值作爲下一個的條件。 – malthe 2015-06-09 19:53:21

相關問題