索引
前言
一、db.collection.createIndex()
1.1 认识
db.<collection>.createIndex()
对集合创建索引。
1.2 语法
db.<collection>.createIndex( <keys>, <options>, <commitQuorum>)
-
key
: 包含字段和值对的文档,其中字段是索引键,值描述该字段的索引类型。对于字段的升序索引,指定值为1
。对于降序索引,请指定值-1
。星号 (*
) 不是有效的索引名称。 -
options
: 可选。 包含一组控制索引创建的设立的文档。-
unique
: 可选。 创建唯一索引,以便集合不会接受索引键值与索引中现有值匹配的文档插入或更新。指定true
可创建唯一索引。默认值为false
。 -
name
: 可选。索引名称。如果未指定,MongoDB
将通过连接索引字段的名称和排序顺序来生成索引名称。 -
partialFilterExpression
: 可选。如果指定,索引只引用与过滤器表达式匹配的文档。 -
sparse
: 可选。 如果为true
,则索引仅引用具有指定字段的文档。这些索引使用的空间较少,但在某些情况下(尤其是排序),其行为会有所不同。 默认值为false
。 -
expireAfterSeconds
: 可选。指定以秒为单位的生存时间 (TTL
) 值,以便控制MongoDB
在此集合中保留文档的时长。此选项仅会应用于TTL
索引。 -
hide
: 可选。一个标志,用于确定是否从查询规划器中隐藏索引。隐藏索引不会作为查询计划选择的一部分进行评估。默认值为false
。 -
storageEngine
: 可选。允许用户在创建索引时基于每个索引配置存储引擎。 -
collation
: 可选。指定索引的排序规则。如果在集合级别指定排序规则, 如果创建索引时未指定排序规则,MongoDB
将使用集合的默认排序规则创建索引。如果您在创建索引时指定了排序规则,MongoDB
将使用指定的排序规则创建索引。指定排序规则时,locale
字段为必填字段;所有其他排序规则字段均为可选字段。collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
-
-
commitQuorum
: 可选。承载数据的投票副本集成员的最小数量(即提交法定节点数),包括主节点,必须在主节点将indexes
标记为就绪之前报告索引构建成功。投票 成员是members[n].votes
大于0
的任何副本集成员。-
votingMembers
: - 所有承载数据的投票副本集节点(默认设置)。 -
majority
- 承载数据的有投票权副本集成员的简单多数。 -
<int>
- 承载数据的有投票权副本集成员的特定数量。 -
0
- 禁用法定人数投票行为。节点同时开始构建索引,但在完成索引构建之前不会投票或者等待达到法定人数。如果您使用0
的提交法定人数开始构建索引,则以后无法使用setIndexCommitQuorum
修改提交法定人数。
-
1.3 用法
单字段索引 Single Field Index
: 对单个字段进行添加索引, 从而加速查询速度、sort
排序速度。如果升序或降序索引位于单个字段上,则该字段上的排序操作可以是任一方向。语法如下:
db.accountsWithIndex.insertMany([ { name: "alice", balance: 50, currency: [ "GBP", "USD" ] }, { name: "bob", balance: 20, currency: [ "AUD", "USD" ] }, { name: "bob", balance: 300, currency: [ "CNY" ] } ]);
db.accountsWithIndex.createIndex( { name: 1} );
db.accountsWithIndex.getIndexes();
// 输出结果:
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { name: 1 }, name: 'name_1' }
]
db.accountsWithIndex.find({ name: "bob" }).explain("executionStats");
// 输出结果:
{
queryPlanner: {
winningPlan: {
stage: 'FETCH',
inputStage: {
stage: 'IXSCAN',
indexName: 'name_1',
}
},
},
}
复合索引 Compound Index
: 如果 keys
文档指定了超过一个字段,则 createIndex()
将创建一个复合索引。复合索引遵循前缀子集原则, 如果查询键包含索引键或索引前缀, MongoDB
会使用索引加速这些查询键的查询速度。如果排序键包含索引键或索引前缀, 且排序键的排列顺序与其在索引中出现的顺序相同, 且排序模式相同, 则 MongoDB
可以使用索引对查询结果排序。
db.collection.createIndex({ A: 1, B: 1, C: -1 }) // A 字段升序, B 字段升序, C 字段降序
db.collection.find({ A: xx }).explain("executionStats") ; // A 是索引的前缀,完全利用索引 可以用 .explain("executionStats") 检查是否使用了索引。
db.collection.find({ A: xx, B: yy}).explain("executionStats") ; // A, B 都是索引前缀,完全利用索引 可以用 .explain("executionStats") 检查是否使用了索引。
db.collection.find({ A: xx, B: yy, C: zz }).explain("executionStats") ; // A, B, C 都是索引的一部分,完全利用索引 可以用 .explain("executionStats") 检查是否使用了索引。
db.collection.find({ B: yy }).explain("executionStats") ; // B 不是索引的前缀,无法利用索引 可以用 .explain("executionStats") 检查是否使用了索引。
db.collection.find({ C: zz }).explain("executionStats") ; // C 不是索引的前缀,无法利用索引 可以用 .explain("executionStats") 检查是否使用了索引。
db.collection.find({ A: xx, C: zz }).explain("executionStats") ; // A 用索引,C 需要内存过滤,查询性能下降 可以用 .explain("executionStats") 检查是否使用了索引。
db.collection.find({ B: yy, C: zz }).explain("executionStats") ; // B, C 都不是索引前缀,无法利用索引 可以用 .explain("executionStats") 检查是否使用了索引。B, C 都不是索引前缀,无法利用索引
二、db.collection.createIndexes()
2.1 认识
db.<collection>.createIndexes()
在集合上创建一个或多个索引。
2.2 语法
db.<collection>.createIndexes( [ keyPatterns ], options, commitQuorum )
-
keyPatterns
: 包含索引规范文档的数组。每个文档都包含字段和值对,其中字段是索引键,值描述该字段的索引类型。要对字段索引按升序排列,请指定值1
;要对索引按降序排列,请指定值-1
。 -
options
: 可选。 包含一组控制索引创建的设立的文档。-
unique
: 可选。 创建唯一索引,以便集合不会接受索引键值与索引中现有值匹配的文档插入或更新。指定true
可创建唯一索引。默认值为false
。 -
name
: 可选。索引名称。如果未指定,MongoDB
将通过连接索引字段的名称和排序顺序来生成索引名称。 -
partialFilterExpression
: 可选。如果指定,索引只引用与过滤器表达式匹配的文档。 -
sparse
: 可选。 如果为true
,则索引仅引用具有指定字段的文档。这些索引使用的空间较少,但在某些情况下(尤其是排序),其行为会有所不同。 默认值为false
。 -
expireAfterSeconds
: 可选。指定以秒为单位的生存时间 (TTL
) 值,以便控制MongoDB
在此集合中保留文档的时长。此选项仅会应用于TTL
索引。 -
hide
: 可选。一个标志,用于确定是否从查询规划器中隐藏索引。隐藏索引不会作为查询计划选择的一部分进行评估。默认值为false
。 -
storageEngine
: 可选。允许用户在创建索引时基于每个索引配置存储引擎。 -
collation
: 可选。指定索引的排序规则。如果在集合级别指定排序规则, 如果创建索引时未指定排序规则,MongoDB
将使用集合的默认排序规则创建索引。如果您在创建索引时指定了排序规则,MongoDB
将使用指定的排序规则创建索引。指定排序规则时,locale
字段为必填字段;所有其他排序规则字段均为可选字段。collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
-
-
commitQuorum
: 可选。承载数据的投票副本集成员的最小数量(即提交法定节点数),包括主节点,必须在主节点将indexes
标记为就绪之前报告索引构建成功。投票 成员是members[n].votes
大于0
的任何副本集成员。-
votingMembers
: - 所有承载数据的投票副本集节点(默认设置)。 -
majority
- 承载数据的有投票权副本集成员的简单多数。 -
<int>
- 承载数据的有投票权副本集成员的特定数量。 -
0
- 禁用法定人数投票行为。节点同时开始构建索引,但在完成索引构建之前不会投票或者等待达到法定人数。如果您使用0
的提交法定人数开始构建索引,则以后无法使用setIndexCommitQuorum
修改提交法定人数。
-
三、db.collection.getIndexes()
3.1 认识
db.<collection>.getIndexes()
返回一个大量,其中包含标识和描述集合上现有索引(包括隐藏索引和当前正在构建的索引)的文档列表。
3.2 语法
db.collection.getIndexes()
四、db.collection.hideIndex()
五、db.collection.unhideIndex()
六、db.collection.dropIndex()
6.1 认识
db.<collection>.dropIndex(index)
从集合中删除或移除指定索引。
6.2 语法
db.collection.dropIndex(index)
七、db.collection.dropIndexes()
7.1 认识
db.collection.dropIndexes()
从集合中删除指定的一个或多个索引(_id
字段上的索引和最后剩余的分片键索引除外)。
7.2 语法
db.collection.dropIndexes()