首页 > 解决方案 > 默认情况下,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});

任何帮助将非常感激。

标签: mongodbindexingmongodb-query

解决方案


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

字段上有一个默认的唯一索引_id,您的索引使用 fields field1+field2+field3+field4。查询优化器可以使用这两个索引中的任何一个。当我尝试使用类似的数据、索引和查询时,我发现它使用了_id字段上的默认索引。

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


在创建索引期间,我是否还必须包含 _id,如下所示?

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

查询将使用复合索引来执行读取。您也可以通过使用explain.

注意,字段上的索引_id不能删除(用户创建的索引可以)。要列出集合上的索引,请使用命令db.collection.getIndexes()


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

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

推荐阅读