跳到主要内容

索引

2025年02月25日
柏拉文
越努力,越幸运

前言


索引命令文档

一、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()