2015-11-05 33 views
0

我有一個評論表,其中有app_id(string), reviews_updated_at(timestamp), description(text)和其他東西。該表擁有約9000萬個條目,我的數據庫實例有2000個讀IOPS限制,下面提到的查詢需要30-40秒才能完成,有什麼辦法可以使這個查詢更快執行嗎?日期時間排序非常緩慢postgresql

我有兩個指標app_id(btree)reviews_updated_at(btree)

查詢:

select * from reviews 
where app_id = '2332223' 
order by review_updated_at 
offset 200 limit 100 

查詢計劃:

Limit (cost=243270.84..364905.97 rows=100 width=258) (actual time=23212.698..32806.020 rows=100 loops=1) 
    -> Index Scan using index_reviews_on_review_updated_at on reviews (cost=0.57..327489222.63 rows=269239 width=258) (actual time=237.720..32805.359 rows=300 loops=1) 
     Filter: ((app_id)::text = '2332223'::text) 
     Rows Removed by Filter: 36376 
Planning time: 0.160 ms 
Execution time: 32806.216 ms 
+0

爲了讓它運行得更快,請添加一個where子句,以便排序的記錄更少。 –

+0

ap_is似乎是一個整數。刪除引號 - >'WHERE ap_id = 2332223'(也許你的統計數據已關閉) – wildplasser

+0

@DanBracuk what where子句?這些是我想要的記錄。 – rajat

回答

2

對於此查詢:

select * 
from reviews 
where app_id = '2332223' 
order by review_updated_at 
offset 200 
limit 100; 

reviews(app_id, review_updated_at)中的最佳指數。實際上,對於這個索引,查詢應該很快。

請注意,比較值時,應確保它們屬於同一類型。如果app_id是一個字符串,那麼應該有引號。

+0

哪些值應該是相同的類型? – rajat

+0

'app_id'和它正在比較的值。 –

+0

app_id的數據類型是字符串,表中的大部分app_id都是字符串,只有其中一些是數字。 – rajat