我想弄清楚如何處理這種情況。最終應該是日期範圍。爲什麼這個mongo查詢會這麼慢?
db.article_raw.count({
"date": {$gt:ISODate("2015-07-08T00:00:00.000Z")},
"searchTerms.term":"iPhone"
})
我有以下3個指標(我知道是重複的,但我試圖弄明白)
{
"date" : 1,
"searchTerms.term" : 1
}
{
"date" : 1
}
{
"searchTerms.term" : 1
}
的數據看起來像
{
title: "a cool title",
date: ISODate("2015-07-09T11:58:36.000Z"),
"searchTerms" : [
{
"term" : "According to Jim",
"relevance" : "0.315"
},
{
"term" : "iPhone",
"relevance" : "0.057"
}
}
}
最後,這是explain()對find()版本的結果。
{
"cursor" : "BtreeCursor date & search",
"isMultiKey" : true,
"n" : 275,
"nscannedObjects" : 275,
"nscanned" : 11022,
"nscannedObjectsAllPlans" : 16142,
"nscannedAllPlans" : 26889,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 1074,
"nChunkSkips" : 0,
"millis" : 59548,
"indexBounds" : {
"date" : [
[
ISODate("2015-07-08T00:00:00.000Z"),
Date(9223372036854775807)
]
],
"searchTerms.term" : [
[
"iPhone",
"iPhone"
]
]
},
"server" : "...",
"filterSet" : false,
"stats" : {
"type" : "FETCH",
"works" : 11023,
"yields" : 1074,
"unyields" : 1074,
"invalidates" : 90,
"advanced" : 275,
"needTime" : 10746,
"needFetch" : 1,
"isEOF" : 1,
"alreadyHasObj" : 0,
"forcedFetches" : 0,
"matchTested" : 0,
"children" : [
{
"type" : "IXSCAN",
"works" : 11022,
"yields" : 1074,
"unyields" : 1074,
"invalidates" : 90,
"advanced" : 275,
"needTime" : 10746,
"needFetch" : 0,
"isEOF" : 1,
"keyPattern" : "{ date: 1, searchTerms.term: 1 }",
"isMultiKey" : 1,
"boundsVerbose" : "field #0['date']: (new Date(1436313600000), new Date(9223372036854775807)], field #1['searchTerms.term']: [\"iPhone\", \"iPhone\"]",
"yieldMovedCursor" : 0,
"dupsTested" : 275,
"dupsDropped" : 0,
"seenInvalidated" : 0,
"matchTested" : 0,
"keysExamined" : 11022,
"children" : []
}
]
}
}
如果這些索引是正確的,我看不到這個查詢如何運行80秒。系統中有近百萬篇文章。而這個計數的結果是大約250.
你應該考慮使用'[searchTerms.term,date]'索引;在範圍匹配之前執行精確匹配總是可取的。 –
你能提供.explain(true)的結果嗎? –
機器有多少內存以及您使用的是哪種版本的mongo。 – ThrowsException