提问者:小点点

MongoDB复合索引多个字段索引_id列默认或不?


我不清楚mongoDB是否会使用我创建的索引。下面是我的数据的样子

_id: an string
field1: string
field2: array
field3: boolean
field4: integer

现在我创建了一个复合索引,如下所示

db.mycollection.createIndex({"field1":1, "field2": 1, "field3": 1, "field4": 1});

现在假设我发出以下查询,在id上进行前缀搜索,在字段的其余部分进行相等

db.mycollection.find({"_id":/^abc/, "field1": "pqr", "field2": "xyz", "field3": true, "field4": 123});

上面的查询是否会使用我在上面创建的复合索引?在创建索引的过程中,我是否也必须包含下面的_id?

db.mycollection.createIndex({"_id": 1, "field1":1, "field2": 1, "field3": 1, "field4": 1});

任何帮助都将不胜感激。


共2个答案

匿名用户

现在假设我发出以下查询,在id上进行前缀搜索,在字段的其余部分进行相等性搜索db. my集合.find({"_id":/^abc/,"field1":"pqr","field2":"xyz","field3":true,"field4":123});上面的查询是否会使用我在上面创建的复合索引?

在字段_id上有一个默认的唯一索引,并且您的索引使用字段field d1 field d2 field d3 field d4。查询优化器可以使用两个索引中的任何一个。当我尝试使用类似的数据、索引和查询时,我看到它使用了_id字段的默认索引。

要验证查询是否正在使用索引以及正在使用哪个索引,请使用查询的解释方法。这会生成一个查询计划,该计划将显示在执行查询时使用了哪个索引。

我必须包括_id以及在创建索引如下?

您可以将_id字段作为复合索引的一部分。例如,您已将索引发布在{"_id": 1,"field1":1,"field2":1,"field3":1,"field4":1}上。请注意,创建索引后将有两个索引-一个在_id字段上,另一个在包含_id的新复合索引上。

查询将使用复合索引来执行读取。您也可以通过使用解释生成查询计划来验证这一点。

请注意,不能删除_id文件中的索引(可以删除用户创建的索引)。要列出集合中的索引,请使用命令db.集合. getIndex()

使用复合索引的注意事项:

  • 使用复合索引时要考虑的因素之一是查询选择性。选择性是查询使用索引缩小结果的能力…请参阅创建确保选择性的查询。
  • 在将数据插入集合时,在更多字段上创建索引可能会产生开销(因为索引也需要创建)。此外,大型索引在操作过程中需要更多内存。

匿名用户

是的,您还必须包含_id以使其与完整索引匹配,否则索引将被使用但部分使用。它不会是COLLSCAN,但num扫描和num返回不会完全匹配。

您可以使用mongo$解释来调试查询计划中使用的索引

db.mycollection.find({"_id":/^abc/, "field1": "pqr", "field2": "xyz", "field3": true, "field4": 123})
    .explain("executionStats")