查询速度非常慢,并且不使用索引-MongoDB
我使用facet来减少索引内存分配 以下是其中一个文档的示例(集合中有超过一百万个文档): 有更多字段,但与案例无关 “f”字段描述面。这些是我为我必须进行的查询创建的索引:查询速度非常慢,并且不使用索引-MongoDB,mongodb,Mongodb,我使用facet来减少索引内存分配 以下是其中一个文档的示例(集合中有超过一百万个文档): 有更多字段,但与案例无关 “f”字段描述面。这些是我为我必须进行的查询创建的索引: { "f.t" : 1, "f.v" : 1, "ai" : -1 } 以及: 现在,我尝试执行的查询是: db.items.find({"$and": [ {"f": {"$elemMatch": {t: "ml", v: {"$in": ["English", "Spanish
{
"f.t" : 1,
"f.v" : 1,
"ai" : -1
}
以及:
现在,我尝试执行的查询是:
db.items.find({"$and": [
{"f": {"$elemMatch": {t: "ml", v: {"$in": ["English", "Spanish", "French", "German"]}}}},
{"f": {"$elemMatch": {t: "rel", v: true}}},
{"f": {"$elemMatch": {t: "k", v: "movie"}}},
{"f": {"$elemMatch": {t: "ry", v: 2014}}},
{"f": {"$elemMatch": {t: "g", v: {"$in": ["Action"]}}}}
]
}).limit(12)
这需要永远。恐怕在服务器级内存分配方面可能存在一些问题
下面是explain()文档:
{
"cursor": "BtreeCursor f.t_1_f.v_1_ai_-1",
"isMultiKey": true,
"n": 12,
"nscannedObjects": 228327,
"nscanned": 228327,
"nscannedObjectsAllPlans": 228327,
"nscannedAllPlans": 228327,
"scanAndOrder": false,
"indexOnly": false,
"nYields": 87096,
"nChunkSkips": 0,
"millis": 120605,
"indexBounds": {
"f.t": [
[
"rel",
"rel"
]
],
"f.v": [
[
true,
true
]
],
"ai": [
[{
"$maxElement": 1
}, {
"$minElement": 1
}]
]
},
"server": "h00222.mongolab.com:42100",
"filterSet": false,
"stats": {
"type": "LIMIT",
"works": 315226,
"yields": 87096,
"unyields": 87096,
"invalidates": 0,
"advanced": 12,
"needTime": 228315,
"needFetch": 86899,
"isEOF": 1,
"children": [{
"type": "KEEP_MUTATIONS",
"works": 315226,
"yields": 87096,
"unyields": 87096,
"invalidates": 0,
"advanced": 12,
"needTime": 228315,
"needFetch": 86899,
"isEOF": 0,
"children": [{
"type": "FETCH",
"works": 315226,
"yields": 87096,
"unyields": 87096,
"invalidates": 0,
"advanced": 12,
"needTime": 228315,
"needFetch": 86899,
"isEOF": 0,
"alreadyHasObj": 0,
"forcedFetches": 0,
"matchTested": 12,
"children": [{
"type": "IXSCAN",
"works": 228327,
"yields": 87096,
"unyields": 87096,
"invalidates": 0,
"advanced": 228327,
"needTime": 0,
"needFetch": 0,
"isEOF": 0,
"keyPattern": "{ f.t: 1.0, f.v: 1.0, ai: -1.0 }",
"isMultiKey": 1,
"boundsVerbose": "field #0['f.t']: [\"rel\", \"rel\"], field #1['f.v']: [true, true], field #2['ai']: [MaxKey, MinKey]",
"yieldMovedCursor": 0,
"dupsTested": 228327,
"dupsDropped": 0,
"seenInvalidated": 0,
"matchTested": 0,
"keysExamined": 228327,
"children": []
}]
}]
}]
}
}
对可能发生的事情有什么想法吗
谢谢。当您尝试将$and子句的各个元素作为单独的查询运行时,索引是否可以用于所有查询?是的,它可以@Philippy根据解释,它确实使用索引来最初缩小搜索范围。然后它继续扫描/过滤实际文档。如果是在mysql中,那么这个查询将是一个6表连接,其中5个表是facets表。您可能不应该期望它能像一个更简单的查询那样执行。我对mongo的内部工作还不太熟悉,不能说这是“出于设计”,是一个疏忽还是一个bug。
db.items.find({"$and": [
{"f": {"$elemMatch": {t: "ml", v: {"$in": ["English", "Spanish", "French", "German"]}}}},
{"f": {"$elemMatch": {t: "rel", v: true}}},
{"f": {"$elemMatch": {t: "k", v: "movie"}}},
{"f": {"$elemMatch": {t: "ry", v: 2014}}},
{"f": {"$elemMatch": {t: "g", v: {"$in": ["Action"]}}}}
]
}).limit(12)
{
"cursor": "BtreeCursor f.t_1_f.v_1_ai_-1",
"isMultiKey": true,
"n": 12,
"nscannedObjects": 228327,
"nscanned": 228327,
"nscannedObjectsAllPlans": 228327,
"nscannedAllPlans": 228327,
"scanAndOrder": false,
"indexOnly": false,
"nYields": 87096,
"nChunkSkips": 0,
"millis": 120605,
"indexBounds": {
"f.t": [
[
"rel",
"rel"
]
],
"f.v": [
[
true,
true
]
],
"ai": [
[{
"$maxElement": 1
}, {
"$minElement": 1
}]
]
},
"server": "h00222.mongolab.com:42100",
"filterSet": false,
"stats": {
"type": "LIMIT",
"works": 315226,
"yields": 87096,
"unyields": 87096,
"invalidates": 0,
"advanced": 12,
"needTime": 228315,
"needFetch": 86899,
"isEOF": 1,
"children": [{
"type": "KEEP_MUTATIONS",
"works": 315226,
"yields": 87096,
"unyields": 87096,
"invalidates": 0,
"advanced": 12,
"needTime": 228315,
"needFetch": 86899,
"isEOF": 0,
"children": [{
"type": "FETCH",
"works": 315226,
"yields": 87096,
"unyields": 87096,
"invalidates": 0,
"advanced": 12,
"needTime": 228315,
"needFetch": 86899,
"isEOF": 0,
"alreadyHasObj": 0,
"forcedFetches": 0,
"matchTested": 12,
"children": [{
"type": "IXSCAN",
"works": 228327,
"yields": 87096,
"unyields": 87096,
"invalidates": 0,
"advanced": 228327,
"needTime": 0,
"needFetch": 0,
"isEOF": 0,
"keyPattern": "{ f.t: 1.0, f.v: 1.0, ai: -1.0 }",
"isMultiKey": 1,
"boundsVerbose": "field #0['f.t']: [\"rel\", \"rel\"], field #1['f.v']: [true, true], field #2['ai']: [MaxKey, MinKey]",
"yieldMovedCursor": 0,
"dupsTested": 228327,
"dupsDropped": 0,
"seenInvalidated": 0,
"matchTested": 0,
"keysExamined": 228327,
"children": []
}]
}]
}]
}
}