2011-06-27 58 views
1

我有類似這樣的周圍105 milions記錄:優化MongoDB的

{ 
    "post_id": 1314131221, 
    "date": 1309187001, 
    "upvotes": 2342 
} 
MongoDB中收集

。 我也有一個關於「post_id」和「日期」的索引。

那麼我要做到這一點:

db.fb_pages_fans.find({ 
    post_id: 1314131221, 
    date: {"$gt": 1309117001, "$lta": 1309187001} 
}).sort({date: 1}); 

如果我設置在特定日期 「日期」:

    當它返回30條記錄
  • ,花了〜130MS
  • 當返回90條記錄,花費約700ms
  • 當它返回180條記錄時,花費約1200ms

當然我在說第一個查詢,第二個和更多的查詢速度非常快,但我需要快速地進行第一個查詢。

從90個記錄開始,它比我現在使用的PostgreSQL慢得多。爲什麼這麼慢?

btw。在105mil記錄中提到的兩個「cols」創建索引需要大約24小時

它運行在一臺機器與12GB RAM,這裏是當我執行查詢mongostats日誌:

insert query update delete getmore command flushes mapped vsize res faults locked % idx miss %  qr|qw ar|aw netIn netOut conn  time 
    0  0  0  0  0  1  0 23.9g 24.1g  8m  0  0   0  0|0  0|0 62b  1k  1 18:34:04 
    0  1  0  0  0  1  0 23.9g 24.1g  8m  21  0   0  0|0  0|0 215b  3k  1 18:34:05 

回答

1

如果你的第一個查詢是緩慢的,所有consequtive,類似的查詢速度快,然後蒙戈移動查詢從磁盤到內存的數據。使用這些大小的數據集相對難以避免。使用mongostat並檢查錯誤統計信息,以查看在查詢過程中是否收到頁面錯誤。或者,您的索引可能不適合內存,在這種情況下,您可以試着平衡它們,使其相關的高吞吐量部分始終處於物理內存中。

此外,我們正在談論一個單一的物理數據庫或分片設置?