2011-09-21 115 views
4

我們有一個大約1M文件的mongo數據庫,我們想要使用處理字段查詢這個數據庫以查找我們以前沒有看到的文檔。爲此,我們正在設置一個名爲_processed的新字段。MongoDB查詢具有不存在字段和索引的記錄

要查詢哪些需要處理的文件,我們查詢的文件不具有這個處理場:

db.stocktwits.find({ "_processed" : { "$exists" : false } }) 

然而,這個查詢需要30秒左右,每次來完成,這是相當緩慢。有一個位於_processed字段的索引(asc):

db.stocktwits.ensureIndex({ "_processed" : -1 },{ "name" : "idx_processed" }); 

添加此索引不會改變查詢性能。還有一些其他索引坐在集合上(即ID idx &是每個文檔中幾個字段的唯一索引)。

_processed字段很長,也許這應該更改爲布爾使事情更快?

我們使用$哪裏查詢(即$where : this._processed==null)做同樣的事情$exists : false嘗試和性能是差不多的(幾秒鐘慢這是有道理的)...

任何想法上會是什麼會導致性能下降(或者正常)?有沒有人有關於如何提高查詢速度的建議?

乾杯!

+0

只是在創建文檔時不是選項而只是將_processed字段設置爲'false'? –

+0

感謝您的評論。這是可行的(但是作爲最後的手段) - 我想避免這種傾銷過程被刺激。 _processed字段在這個實例中很長,所以我們只需將它設置爲類似於0或-1的值。這是一個很好的觀點,但是,將處理後的字段類型更改爲bool會使事情變得更快嗎?處理時間很長的唯一原因是存儲處理時間的時間戳(僅用於幫助進行任何調試),但實際上它可以設置爲bool,如果我們確實需要它,我們可以使用_processed(bool)和_porcessed_timestamp (長)..? – NightWolf

回答

5

升級到2.0會爲你做到這一點:

從MongoDB.org:

Before v2.0, $exists is not able to use an index. Indexes on other fields are still used.

+0

有趣,沒有知道這一點。很高興知道! –

+2

同上,不知道這個(想想這裏一個重要的教訓,再次像這些RTFM時代一樣)。謝謝,解決了我的問題。只需將查詢更改爲{'_processed':null}。 Genius DV87! – NightWolf

+0

現在運行它,查詢需要整個8ms。邪惡! – NightWolf

4

其緩慢的,因爲檢查_processed -> not exists犯規提供多少選擇性。它就像有一個「性別」索引 - 因爲只有兩個可能的選項malefemale那麼如果你有1M行和索引Gender它將不得不掃描50%或500K行來查找所有男性。

您需要讓您的索引更具選擇性。

+0

感謝您的評論科迪。我看到你的觀點,在Mongo中,所有的空字段都被索引。因此,如果我有一個大多數處理過的數據集,它的掃描效果並不差,但它不得不掃描每個文檔。即使我做了_processed = false,它真的6打了另一半作爲_processed = false或_processed = null爲所有密集的目的是相等的... – NightWolf

+0

我不認爲這是相關的。 MongoDB使用遊標返回結果。只要這些值被索引,就沒有「掃描」,結果可以儘可能快地進行回放,因爲您可以抓取它們。這裏的問題是搜索沒有使用索引。 –

相關問題