【问题标题】:Does mongodb takes advantage of an index with missing field?mongodb 是否利用缺少字段的索引?
【发布时间】:2019-03-02 08:54:57
【问题描述】:

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

感谢索引,查询db.things.find({foo: 'something'})速度很快,而且不扫描文档。

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

直观地说,现有索引应该会有所帮助,因为它只需要找到与foo: 'something' 匹配的元素(快速),然后扫描(希望很少)文档。

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

谢谢,

【问题讨论】:

标签: mongodb indexing mongodb-query


【解决方案1】:

你是对的。即使在搜索中使用其他字段,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”进行其余的搜索

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2017-04-23
    • 2015-07-23
    • 2016-01-27
    • 2017-07-07
    相关资源
    最近更新 更多