2013-06-05 80 views
0

即使查詢中的只有字段是索引字段,一些查詢在相對較小的集合(〜200K文檔)上可疑緩慢。例如(使用Java驅動程序):MongoDB不使用索引來區分索引字段還是計數索引字段?

eventReportColl.distinct("host").size() 

需要將近三秒鐘,在coll.distinct("host").length大約需要兩個外殼,即使主機被索引:

coll.getIndexes() 

...

{ 
    "v" : 1, 
    "key" : { 
    "host" : 1 
    }, 
    "ns" : "db.event_reports", 
    "name" : "host_1" 
} 

以上任何原因查詢會不會使用主機索引?不幸的是,它不會出現解釋()的獨特作品,所以我只能假設這是原因。這是在MongoLab上運行的v2.2.4。 (另外,雖然兩三秒看起來可能不是很多,但是當你有一個API在返回之前運行這些類型的查詢中的三個或四個時,它就會增加......更不用說最終的數據庫大小增長了)。有沒有辦法強制使用索引或以其他方式加快查詢次數?

+0

該領域的基數是什麼?還有什麼MongoLab實例?你確定這不是MongoLab真的讓你放慢速度嗎? – Sammaye

+0

關於cardinality這個領域有大約80K獨特的~200K文檔在集合(所有文檔都有問題的領域)。 MongoLab實例是免費層(我們的開發數據庫),但我不認爲這是問題,因爲我們有一個付費實例(共享單個節點很小),所以我對此進行了上述操作,並且驅動程序需要4秒以上並在shell中超過3秒以上(並不奇怪它會花費更長的時間,因爲這是一個更大的數據集)。 – Exupery

回答

1
db.runCommand({distinct : 'eventReportColl', key : 'host'}) 

這會給你查詢解釋。您可以檢查使用了哪個索引或「n」,「nscanned」,「nscannedObjects」。這將幫助您瞭解爲什麼查詢速度很慢。

+0

謝謝,看起來它使用的是索引,考慮到它的速度有多慢,令人驚訝和難過。看起來MongoDB可能不適合我們的需求。 – Exupery

+1

此查詢必須至少掃描'主機'索引的所有索引元素。而且這個操作不能那麼快(也取決於在RAM中緩存了多少索引)。如果此類查詢的頻率很高,則最好在每次插入時計算一個單獨的計數器。 –