【发布时间】:2015-07-11 17:20:47
【问题描述】:
我正试图弄清楚如何处理这种情况。最终应该是日期范围。
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"
}
}
}
最后,这是 find() 版本的 explain() 的结果。
{
"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。
-
你通过performance tuning了吗?
-
@ChrisHeald 这不是正在发生的事情吗?
标签: javascript performance mongodb optimization mongodb-query