代码之家  ›  专栏  ›  技术社区  ›  aherve

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

  •  0
  • aherve  · 技术社区  · 8 年前

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

    db.things.find({foo: 'something'}) 速度快,不扫描文档。

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

    直观地说,我认为现有的索引应该会有所帮助,因为它只需要找到匹配的元素 foo: 'something'

    这是mongodb使用的东西,还是它只是忽略了 索引作为查询使用不同的字段?

    1 回复  |  直到 8 年前
        1
  •  3
  •   André Adriano    8 年前

    你说得对。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”执行其余的搜索

    推荐文章