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

数组上的Mongo索引

  •  0
  • user1578872  · 技术社区  · 6 年前

    我有一个蒙哥文件如下。在这里,项目就像第一个项目在数组索引0上,第二个项目在数组索引1上,第三个项目在数组索引2上,。。。。

    {
      "_id": "234463456453643563456",
      "name": "Mike",
      "empId": "10",
      "managerId": "8",
      "projects" : [ "123", "456", "789"]
    }
    

    我有项目领域的索引,我想搜索员工的第一个项目是123,第二个项目是456。。。

    我有如下索引,

    createIndex({"projects":1});
    

    当我像下面这样搜索时,需要时间。

    {“$或”:[{”projects.2“:”123“},{”projects.4“:”456“}{ "9768"}]}

    但是,同样的查询在创建索引之后运行得非常好,比如,它非常快。

    createIndex({"projects.0":1});
    createIndex({"projects.1":1});
    createIndex({"projects.2":1});
    createIndex({"projects.3":1});
    createIndex({"projects.4":1});
    createIndex({"projects.5":1});
    

    创建索引后,每个查询可节省3秒。

    它是如何在内部工作的?为什么会有这么大的差别?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Akrion    6 年前

    如果您使用 explain 命令。下面是一个简短的总结:

    {
        "_id" : ObjectId("5b7fa665844b5ebfad064b1c"),
        "arr" : [ "123", "456", "789"]
    },
    {
        "_id" : ObjectId("5b80f96e9fceda195ba853af"),
        "arr" : [ "ABC", "DEF", "FOO"]
    }
    

    我的索引: createIndex({"arr":1})

    find({arr: '123'}).explain() explain result :

    ...
    "indexName" : "_arr_",
    "isMultiKey" : true,
    "multiKeyPaths" : {
        "arr" : [ 
            "arr"
        ]
    },
    ...
    

    find({arr.0: '123'}).explain() ?

    ...
    "winningPlan" : {
        "stage" : "COLLSCAN",
        "filter" : {
            "arr.0" : {
                "$eq" : "123"
            }
        },
        "direction" : "forward"
    },
    ...
    

    好吧,现在我们有一个可爱的充分 COLLSCAN 作为“获胜”计划:)。

    createIndex({"arr.0":1}); 然后 给了我们:

    ...
    "winningPlan" : {
        "stage" : "FETCH",
        "inputStage" : {
            "stage" : "IXSCAN",
            "keyPattern" : {
                "arr.0" : 1
            },
            "indexName" : "_arr.0_",
            "isMultiKey" : false,
            "multiKeyPaths" : {
                "arr.0" : []
            },
            "isUnique" : false,
            "isSparse" : false,
            "isPartial" : false,
            "indexVersion" : 2,
            "direction" : "forward",
            "indexBounds" : {
                "arr.0" : [ 
                    "[\"123\", \"123\"]"
                ]
            }
        }
    }
    ...
    

    arr 如果要按数组索引搜索,则这是不够的,因为:

    MongoDB为数组中的每个元素创建一个索引键。这些 多键索引支持对数组字段的高效查询

    所以这就是当你做初始索引时发生的事情。。。mongo找到包含 123 explain .