索引集合仍然扫描所有行以进行简单查找

时间:2015-07-07 04:34:29

标签: mongodb mongodb-query

我在一个相当大的mongodb集合中有以下文档结构(大约1000万个文档):

{
    _id: <ObjectId>,
    p: [
         "user A"
         "user B"
    ],
    data: "not important"
}

“p”字段表示其所属数据的两个用户ID(将其视为成对用户之间的对话集合)。它始终是一个包含2个用户ID的数组,并且是唯一的(没有其他文档在其“p”字段中具有相同的用户对)。

我在这个字段上有一个索引:

{
    "v" : 1,
    "key" : {
        "p" : 1
    },
    "ns" : "mydb.messages",
    "name" : "p_1",
    "background" : true,
    "safe" : true
}

问题是当我在我的应用程序中进行查找时,mongodb正在扫描所有可能的行。例如,用户A可能有2800个其他会话,当我执行以下查询只是为了找到与其他特定用户的对话时,它会扫描所有2800行:

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字符串。

由于存在大量这些查询,因此严重拖累了性能。我假设我没有正确索引字段,或者索引在包含数组的字段上没有按预期执行。在任何情况下,非常感谢任何帮助。

0 个答案:

没有答案