Docs 菜单
Docs 主页
/ /

管理索引

本页介绍如何管理现有索引。有关创建索引的说明,请参阅特定索引类型页面。

以下部分提供了查看集合或整个数据库上现有索引的方法。

要返回一个集合上的所有索引的列表,请使用 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 中查看集合中所有索引的列表,请在左侧窗格中单击目标集合,然后选择 Indexes 标签页。

在 Compass 中查看集合的索引

有关此标签页中显示的信息的详细信息,请参阅 Compass 文档。

提示

在删除索引之前将其隐藏

删除生产中频繁使用的索引可能导致应用程序性能下降。在删除索引之前,您可以通过隐藏索引来评估删除的潜在影响。

隐藏的索引不能支持查询。如果隐藏索引后发现严重的负面性能影响,请考虑保持该索引并取消隐藏,以便查询可继续使用它。

要了解如何删除现有索引,请参阅删除索引。

要了解如何在 MongoDB Compass 中删除索引,请参阅管理 Compass 中的索引。

要修改 MongoDB Shell 中的现有索引,您需要删除并重新创建索引。此规则的例外是 TTL 索引,可以结合使用 collMod 命令与 index 集合标志来对其进行修改。

要修改 MongoDB Compass 中的现有索引,您需要删除并重新创建索引。

如果您移除生产中频繁使用的索引,则可能导致应用程序性能下降。要确保查询在修改期间仍可使用索引,您可以创建临时的冗余索引,使其中包含与修改后的索引相同的字段。

此示例创建了一个新索引,并修改该索引使其成为唯一索引

1

运行以下命令:

db.siteAnalytics.createIndex( { "url": 1 } )

此命令将返回索引的名称:

url_1
2

运行以下命令:

db.siteAnalytics.createIndex( { "url": 1, "dummyField": 1 } )

此命令将返回索引的名称:

url_1_dummyField_1

该临时索引可让您在不影响性能的情况下安全删除原始 { "url": 1 } 索引。

3

运行以下命令:

db.siteAnalytics.dropIndex( { "url_1" } )

该命令将返回:

{ nIndexesWas: 3, ok: 1 }
4

运行以下命令:

db.siteAnalytics.createIndex( { "url": 1 }, { "unique": true } )

此命令将返回索引的名称:

url_1

系统会重新创建 url_1 索引,您可删除临时索引,而不会影响性能。对 url 字段的查询可使用这个新的唯一索引。

5

运行以下命令:

db.siteAnalytics.dropIndex( { "url_1_dummyField_1" } )

该命令将返回:

{ nIndexesWas: 3, ok: 1 }
6

要查看针对 siteAnalytics 集合的索引,请运行以下命令:

db.siteAnalytics.getIndexes()

该命令将返回这些索引,从而表明 url_1 索引现在是唯一索引:

[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { url: 1 }, name: 'url_1', unique: true }
]

如果一个分片集合在包含集合数据块的每个分片上没有完全相同的索引(包括索引选项),则该集合的索引不一致。尽管一般操作过程中不应出现索引不一致的情况,但这种情况仍有可能发生,例如:

默认情况下,配置服务器主节点会检查分片集合的分片中是否存在索引不一致,在配置服务器主节点上运行命令 serverStatus 时会返回字段 shardedIndexConsistency 以报告存在索引不一致的分片集合数量。

如果shardedIndexConsistency 报告存在任何索引不一致的情况,您可以对分片的集合运行带有checkMetadataConsistencycheckIndexes: true 命令,以查找不一致之处。

  1. 运行 checkMetadataConsistency 命令:

    db.runCommand( {
    checkMetadataConsistency: 1,
    checkIndexes: true
    } )
  2. 如果集合存在不一致的索引,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 存在两个不一致:

    1. 名为 reviewDt_1 的索引在该集合的分片之间存在不一致的属性,具体是 expireAfterSeconds 属性不同。

    2. shard02 上该集合缺少名为 page_1_score_1 的索引。

要解决特定分片上的集合中缺少索引而产生的不一致问题,

您可以执行以下任一操作:

  • mongos 实例发出索引构建 db.collection.createIndex()。此操作仅会对缺少该索引的分片构建集合的索引。

    -或-

  • 在受影响的分片上为该集合执行滚动索引构建

    注意

警告

避免同时执行滚动索引和复制索引构建过程,因为这可能会导致意外问题,例如构建中断和循环崩溃。

要解决分片之间索引属性不同的问题,

从受影响的分片上的集合中删除不正确的索引,然后重新生成索引。要重建索引,您可以采取以下任一操作:

如果不一致涉及 expireAfterSeconds 属性,则可运行 collMod 命令来更新秒数,无需删除并重新构建索引。

后退

在分片集群上创建

在此页面上