2011-12-07 106 views
0

我目前有一個相當大的數據庫(約250米文件)的MongoDB設置。目前,我有一個主要集合,其中大部分數據都具有單一索引(時間)。只有時間位於查詢的where部分(使用索引)時,這會導致可接受的查詢時間。MongoDB查詢子集

問題是當我需要使用複合鍵 - 時間索引使用大約2.5GB的內存,並且我只有4GB的服務器,所以我不想創建複合鍵索引,因爲那樣會阻止所有索引適應內存,從而使事情減慢很多。

所以我的問題是這樣的:我可以先查詢時間,然後查詢其他變量的子集?

我應該指出我正在使用Ruby驅動程序。

此刻,我的查詢看起來是這樣的(這是很慢):

trade_stop_loss_time = ticks.find_one({ 
     "time" => { "$gt" => trade_time_open, "$lte" => trade_time_close }, 
     "bid" => { "$lte" => stop_loss_price } 
    }).sort({"time" => 1}) 

謝謝!

回答

1

如果您只是簡單地執行您提交的查詢,那麼數據庫應該足夠聰明,可以做到這一點。

您的查詢應基本上使用time索引篩選候選集,然後掃描其餘對象以獲取bid參數。這應該比在客戶端上進行掃描更有效率。

您應該在您的查詢中運行explain()以查明它在做什麼。如果它使用索引(BtreeCursor),並且掃描對象的數量只是給定時間範圍內的項目數量,則表示沒有問題。考慮到你的限制,我認爲沒有比這更好的方法。在客戶端執行相同的操作肯定會變慢。

當然,一個limit和一個小的時間框架將有助於使您的查詢更快,但這可能是外部因素。 mongostat也可能有助於發現問題。但是,如果您的文檔和/或時間跨度很大,添加複合索引可能會更好:從磁盤加載大量大文檔(因爲您的RAM已滿)需要一些時間。從磁盤分頁索引也很慢,但數據少得多。

一個很好的答案只能是實驗。

0

您可以使用時間索引返回結果,然後進一步過濾客戶端?除此之外,我認爲你幾乎沒有運氣。