本页介绍如何管理现有索引。有关创建索引的说明,请参阅特定索引类型页面。
查看现有索引
以下部分提供了查看集合或整个数据库上现有索引的方法。
列出集合上的所有索引
要返回一个集合上的所有索引的列表,请使用 db.collection.getIndexes() 方法或类似于您的驱动程序所用的方法。
例如,要查看 people 集合上的所有索引,请运行以下命令:
db.people.getIndexes()
列出数据库的所有索引
要列出数据库中的所有集合索引,请在 mongosh 中运行如下命令:
db.getCollectionNames().forEach(function(collection) { indexes = db[collection].getIndexes(); print("Indexes for " + collection + ":"); printjson(indexes); });
列出特定类型的索引
要列出所有数据库中所有集合的某一类型(如哈希或文本)的所有索引,请在 mongosh 中运行以下命令:
// The following finds all hashed indexes db.adminCommand("listDatabases").databases.forEach(function(d){ let mdb = db.getSiblingDB(d.name); mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){ let currentCollection = mdb.getCollection(c.name); currentCollection.getIndexes().forEach(function(idx){ let idxValues = Object.values(Object.assign({}, idx.key)); if (idxValues.includes("hashed")) { print("Hashed index: " + idx.name + " on " + d.name + "." + c.name); printjson(idx); }; }); }); });
删除索引
提示
在删除索引之前将其隐藏
删除生产中频繁使用的索引可能导致应用程序性能下降。在删除索引之前,您可以通过隐藏索引来评估删除的潜在影响。
隐藏的索引不能支持查询。如果隐藏索引后发现严重的负面性能影响,请考虑保持该索引并取消隐藏,以便查询可继续使用它。
要了解如何删除现有索引,请参阅删除索引。
要了解如何在 MongoDB Compass 中删除索引,请参阅管理 Compass 中的索引。
修改索引
使用临时索引尽量减少对性能的影响
如果您移除生产中频繁使用的索引,则可能导致应用程序性能下降。要确保查询在修改期间仍可使用索引,您可以创建临时的冗余索引,使其中包含与修改后的索引相同的字段。
例子
此示例创建了一个新索引,并修改该索引使其成为唯一索引。
查找分片中不一致的索引
如果一个分片集合在包含集合数据块的每个分片上没有完全相同的索引(包括索引选项),则该集合的索引不一致。尽管一般操作过程中不应出现索引不一致的情况,但这种情况仍有可能发生,例如:
当用户使用
unique键约束创建索引,且一个分片包含具有重复文档的数据段时。在此类情况下,创建索引操作可能会对没有重复项的分片成功完成,而对有重复项的分片失败。当用户以滚动方式跨分片创建索引(即在分片中逐个手动构建索引),但未能为关联分片构建索引或错误地构建了具有不同规范的索引。
默认情况下,配置服务器主节点会检查分片集合的分片中是否存在索引不一致,在配置服务器主节点上运行命令 serverStatus 时会返回字段 shardedIndexConsistency 以报告存在索引不一致的分片集合数量。
如果shardedIndexConsistency 报告存在任何索引不一致的情况,您可以对分片的集合运行带有checkMetadataConsistency 的checkIndexes: true 命令,以查找不一致之处。
运行
checkMetadataConsistency命令:db.runCommand( { checkMetadataConsistency: 1, checkIndexes: true } ) 如果集合存在不一致的索引,
checkMetadataConsistency命令将返回有关不一致索引的详细信息,如下所示:{ cursor: { id: Long('0'), ns: 'test.$cmd.aggregate', firstBatch: [ { type: 'InconsistentIndex', description: 'Found an index of a sharded collection that is inconsistent between different shards', details: { namespace: 'test.reviews', info: { missingFromShards: [], inconsistentProperties: [ { k: 'expireAfterSeconds', v: Long('600') }, { k: 'expireAfterSeconds', v: 3600 } ], indexName: 'reviewDt_1' } } }, { type: 'InconsistentIndex', description: 'Found an index of a sharded collection that is inconsistent between different shards', details: { namespace: 'test.reviews', info: { missingFromShards: [ 'shard02' ], inconsistentProperties: [], indexName: 'page_1_score_1' } } } ] }, ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1752574769, i: 1 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1752574760, i: 1 }) } 输出表明分片的集合
test.reviews存在两个不一致:名为
reviewDt_1的索引在该集合的分片之间存在不一致的属性,具体是expireAfterSeconds属性不同。在
shard02上该集合缺少名为page_1_score_1的索引。
- 要解决特定分片上的集合中缺少索引而产生的不一致问题,
您可以执行以下任一操作:
从
mongos实例发出索引构建db.collection.createIndex()。此操作仅会对缺少该索引的分片构建集合的索引。-或-
在受影响的分片上为该集合执行滚动索引构建。
注意
滚动索引可能会对您的部署影响。 有关何时使用此索引构建的信息,请参阅滚动索引构建。
警告
避免同时执行滚动索引和复制索引构建过程,因为这可能会导致意外问题,例如构建中断和循环崩溃。
- 要解决分片之间索引属性不同的问题,
从受影响的分片上的集合中删除不正确的索引,然后重新生成索引。要重建索引,您可以采取以下任一操作:
从
mongos实例发出索引构建db.collection.createIndex()。此操作仅会对缺少该索引的分片构建集合的索引。-或-
在受影响的分片上为该集合执行滚动索引构建。
注意
滚动索引可能会对您的部署影响。 有关何时使用此索引构建的信息,请参阅滚动索引构建。
如果不一致涉及
expireAfterSeconds属性,则可运行collMod命令来更新秒数,无需删除并重新构建索引。
