Mongodb 索引集合仍在扫描所有行以进行简单查找
我在一个相当大的mongodb集合中拥有以下文档结构(大约1000万个文档): 问题是,当我在应用程序中查找时,mongodb正在扫描所有可能的行。例如,用户A可能有2800个其他对话,当我执行以下查询只是为了查找与另一个特定用户的对话时,它会扫描所有2800行:Mongodb 索引集合仍在扫描所有行以进行简单查找,mongodb,mongodb-query,Mongodb,Mongodb Query,我在一个相当大的mongodb集合中拥有以下文档结构(大约1000万个文档): 问题是,当我在应用程序中查找时,mongodb正在扫描所有可能的行。例如,用户A可能有2800个其他对话,当我执行以下查询只是为了查找与另一个特定用户的对话时,它会扫描所有2800行: db.messages.find({p: ["user A", "user B"]}); 以下是解释输出: { "cursor" : "BtreeCursor p_1 multi", "isMultiKey" : true, "n"
db.messages.find({p: ["user A", "user B"]});
以下是解释输出:
{
"cursor" : "BtreeCursor p_1 multi",
"isMultiKey" : true,
"n" : 0,
"nscannedObjects" : 2805,
"nscanned" : 2806,
"nscannedObjectsAllPlans" : 2805,
"nscannedAllPlans" : 2806,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 23,
"indexBounds" : {
"p" : [
[
"user A",
"user A"
],
[
[
"user A",
"user B"
],
[
"user A",
"user B"
]
]
]
},
"server" : "ip-10-237-195-23:27017"
}
为了可读性,我将用户A和用户B作为实际用户ID字符串的子项
由于有很多这样的查询,这严重影响了性能。我假设我没有正确地为字段编制索引,或者该索引在包含数组的字段上的性能不如预期。无论如何,这里的任何帮助都是非常感谢的。对于初学者来说,您应该像在
{“p”:{“$all”:[“用户A”,“用户B”]}
中一样使用[“用户A”,“用户B”]}
中一样使用$all
,否则您的查询只能将完全格式为[“用户A”,“用户B”]
的元素与相同顺序的元素相匹配。另外,这些只是数组中的值,还是它们实际上是具有自己属性的对象?我在insert和query上对两个“p”成员进行排序,以确保它们以相同的顺序进行查询。它们只是字符串值,而不是对象。在这种情况下,使用$all还会有帮助吗?
db.messages.find({p: ["user A", "user B"]});
{
"cursor" : "BtreeCursor p_1 multi",
"isMultiKey" : true,
"n" : 0,
"nscannedObjects" : 2805,
"nscanned" : 2806,
"nscannedObjectsAllPlans" : 2805,
"nscannedAllPlans" : 2806,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 23,
"indexBounds" : {
"p" : [
[
"user A",
"user A"
],
[
[
"user A",
"user B"
],
[
"user A",
"user B"
]
]
]
},
"server" : "ip-10-237-195-23:27017"
}