mongodb - 默认情况下,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});
任何帮助将非常感激。
解决方案
现在假设我发出以下查询,对 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()
。
使用复合索引的注意事项:
- 使用复合索引时要考虑的因素之一是查询选择性。选择性是查询使用索引缩小结果的能力...请参阅创建确保选择性的查询。
- 在将数据插入集合时,在更多字段上创建索引可能是一种开销(因为索引也需要创建)。此外,大型索引在操作期间需要更多内存。
推荐阅读
- jestjs - Angular 7 Jest 单元测试中的模拟路由器和 Ngzone
- node.js - 我想在 swift 上使用 alamofire 使用登录 API (nodejs)
- java - 更改实体注释类后出现 UnsatisfiedDependencyException
- mysql - 由于 mariadb 安装,Mysql 将无法安装但 mariadb 未安装
- java - 将方法移动到另一个 Java 类,并从原始类调用该方法
- javascript - NodeJS - 没有表达的会话处理
- quarkus - 图像堆中不允许...的实例,因为此类应在图像运行时初始化
- java - 如何在 Antlr4 中为零参数的函数编写语法
- c# - 一次将图像和数字数据添加到数据库的最佳方法是什么?
- python - 使用双 y 轴设置绘图的纵横比