mongodb是否利用缺少字段的索引?

时间:2018-09-26 14:27:36

标签: mongodb indexing mongodb-query

假设我有一个things的mongodb集合,并且已有索引{foo: 1}

由于有了索引,查询db.things.find({foo: 'something'})很快,并且不扫描文档。

但是查询db.things.find({foo: 'something', bar: 'else'})呢?

直觉上,我认为现有索引应该有所帮助,因为只需要(快速)找到匹配foo: 'something'的元素,然后扫描(希望是很少)文档即可。

是mongodb使用的东西,还是因为查询使用不同的字段而忽略了{foo: 1}索引?

谢谢

1 个答案:

答案 0 :(得分:3)

您是正确的。即使在搜索中使用其他字段,MongoDB仍会使用索引。您可以使用db.things.explain().find({foo: 'something', bar: 'else'})进行测试。

您会得到类似的东西:

"winningPlan" : {
    "stage" : "FETCH",
    "filter" : {
            "bar" : {
                    "$eq" : "else"
            }
    },
    "inputStage" : {
            "stage" : "IXSCAN",
            "keyPattern" : {
                    "foo" : 1
            },
            "indexName" : "foo_1",
            "isMultiKey" : false,
            "multiKeyPaths" : {
                    "foo" : [ ]
            },
            "isUnique" : false,
            "isSparse" : false,
            "isPartial" : false,
            "indexVersion" : 2,
            "direction" : "forward",
            "indexBounds" : {
                    "foo" : [
                            "[\"something\", \"something\"]"
                    ]
            }
    }

此列表显示mongoDB如何进行搜索(从下至上)。使用“ IXSCAN”的第一阶段表明mongoDB首先使用索引,然后尝试使用“ FETCH”进行其余的搜索