我不清楚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});
任何帮助都将不胜感激。
现在假设我发出以下查询,在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")