Hidden Indexes隐藏索引

On this page本页内容

New in version 4.4.在版本4.4中新增

Hidden indexes are not visible to the query planner and cannot be used to support a query.隐藏索引对查询计划器不可见,不能用于支持查询。

By hiding an index from the planner, users can evaluate the potential impact of dropping an index without actually dropping the index. 通过对规划器隐藏索引,用户可以评估删除索引的潜在影响,而无需实际删除索引。If the impact is negative, the user can unhide the index instead of having to recreate a dropped index.如果影响是负面的,用户可以取消隐藏索引,而不必重新创建已删除的索引。

Behavior行为

Apart from being hidden from the planner, hidden indexes behave like unhidden indexes; i.e.除了从规划器中隐藏之外,隐藏索引的行为类似于未隐藏索引;即。

  • If a hidden index is a unique index, the index still applies its unique constraint to the documents.如果隐藏索引是唯一索引,则该索引仍将其唯一约束应用于文档。
  • If a hidden index is a TTL index, the index still expires documents.如果隐藏索引是TTL索引,则该索引仍然使文档过期。
  • Hidden indexes are included in listIndexes and db.collection.getIndexes() results.隐藏索引包含在listIndexesdb.collection.getIndexes()结果中。
  • Hidden indexes are updated upon write operations to the collection and continue to consume disk space and memory. 隐藏索引在对集合进行写入操作时更新,并继续消耗磁盘空间和内存。As such, they are included in various statistics operations, such as db.collection.stats() and $indexStats.因此,它们包含在各种统计操作中,如db.collection.stats()$indexStats
  • Hiding an unhidden index or unhiding a hidden index resets its $indexStats. 隐藏未隐藏索引或取消隐藏索引将重置其$indexStatsHiding an already hidden index or unhiding an already unhidden index does not reset the $indexStats.隐藏已隐藏的索引或取消隐藏已未隐藏的索引不会重置$indexStats

Restrictions限制

Examples示例

Create a Hidden Index创建隐藏索引

To create a hidden index, use the db.collection.createIndex() method with the hidden option set to true.要创建hidden索引,请使用db.collection.createIndex()方法,将hidden选项设置为true

Note注意

To use the hidden option with db.collection.createIndex(), you must have featureCompatibilityVersion set to 4.4 or greater. 要在db.collection.createIndex()中使用hidden选项,必须将featureCompatibilityVersion设置为4.4或更高版本。However, once hidden, the index remains hidden even with featureCompatibilityVersion set to 4.2 on MongoDB 4.4 binaries.但是,一旦隐藏,即使在MongoDB 4.4二进制文件上featureCompatibilityVersion设置为4.2,索引仍然隐藏。

For example, the following operation creates a hidden ascending index on the borough field:例如,以下操作在borough字段上创建隐藏的升序索引:

db.addresses.createIndex(
   { borough: 1 },
   { hidden: true }
);

To verify, run db.collection.getIndexes() on the addresses collection:要验证,请在addresses集合上运行db.collection.getIndexes()

db.addresses.getIndexes()

The operation returns the following information:该操作返回以下信息:

[
   {
      "v" : 2,
      "key" : {
         "_id" : 1
      },
      "name" : "_id_"
   },
   {
      "v" : 2,
      "key" : {
         "borough" : 1
      },
      "name" : "borough_1",
      "hidden" : true
   }
]

The index option hidden is only returned if the value is true.只有当值为true时,才会返回索引选项hidden

Hide an Existing Index隐藏现有索引

Note注意

To hide an existing index, you can use the collMod command or mongosh helper db.collection.hideIndex().要隐藏现有索引,可以使用collMod命令或mongosh助手db.collection.hideIndex()

For example, create an index without hiding:例如,创建索引而不隐藏:

db.restaurants.createIndex( { borough: 1, ratings: 1 } );

To hide the index, you can specify either:要隐藏索引,可以指定:

To verify, run db.collection.getIndexes() on the restaurants collection:要验证,请在restaurants集合上运行db.collection.getIndexes()

db.restaurants.getIndexes()

The operation returns the following information:该操作返回以下信息:

[
   {
      "v" : 2,
      "key" : {
         "_id" : 1
      },
      "name" : "_id_"
   },
   {
      "v" : 2,
      "key" : {
         "borough" : 1,
         "ratings" : 1
      },
      "name" : "borough_1_ratings_1",
      "hidden" : true
   }
]

The index option hidden is only returned if the value is true.只有当值为true时,才会返回索引选项hidden

Unhide an Existing Index取消隐藏现有索引

To unhide a hidden index, you can use the collMod command or mongosh helper db.collection.unhideIndex(). 要取消隐藏隐藏索引,可以使用collMod命令或mongosh助手db.collection.unhideIndex()You can specify either:您可以指定以下两者之一:

To verify, run db.collection.getIndexes() on the restaurants collection:要验证,请在restaurants集合上运行db.collection.getIndexes()

db.restaurants.getIndexes()

The operation returns the following information:该操作返回以下信息:

[
   {
      "v" : 2,
      "key" : {
         "_id" : 1
      },
      "name" : "_id_"
   },
   {
      "v" : 2,
      "key" : {
         "borough" : 1,
         "ratings" : 1
      },
      "name" : "borough_1_ratings_1"
   }
]

The index option hidden no longer appears as part of the borough_1_ratings_1 index since the field is only returned if the value is true.索引选项hidden不再显示为borough_1_ratings_1索引的一部分,因为只有当值为true时才会返回该字段。

Because indexes are fully maintained while hidden, the index is immediately available for use once unhidden.由于索引在隐藏时是完全维护的,因此一旦取消隐藏,该索引将立即可用。

←  Case Insensitive IndexesSparse Indexes →