对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

删除哈希分片键索引

从 MongoDB 7.0.3(以及 6.0.12 和 5.0.22)开始,您可以删除哈希分片键的索引。

这可以加快使用哈希分片键分片的集合的数据插入速度。

删除不必要的索引可以加快增删增删改查操作的速度。每个增删改查操作都必须更新与文档相关的所有索引。删除一个索引可以提高所有增删改查操作的速度。

重要

仅当存在针对分片键的支持性非哈希索引时,才应从集合中删除哈希分片键索引。 如果分片键上不存在支持的非哈希索引,则按分片键的查询将执行集合扫描。要查看集合上存在哪些索引,请使用db.collection.getIndexes()

删除哈希分片键索引时,请考虑以下事项:

  • 服务器会为您的集合禁用平衡,并从未来的平衡轮次中排除该集合。因此,如果您之后添加或删除分片,服务器将无法重新平衡集合的数据。要将集合包含在未来的平衡轮次中,请重新创建哈希分片键索引。

  • 删除分片键索引时,范围删除器不会清除集合中任何剩余的孤立索引。在删除哈希分片键索引之前,必须确认集合中不存在孤立文档。有关如何确认集合中没有孤立文档,请参阅以下过程。

1

运行以下命令以停止负载均衡器:

sh.stopBalancer()

您只能在sh.stopBalancer() 上运行mongos 。如果在mongod上运行, sh.stopBalancer()会产生错误。

2

从 MongoDB 6.0.3 开始,您可以使用$shardedDataDistribution阶段运行聚合,以确认没有剩余孤立文档:

db.aggregate([
{ $shardedDataDistribution: {} },
{ $match: { "ns": "<database>.<collection>" } }
])

$shardedDataDistribution 有类似如下的输出:

[
{
"ns": "test.names",
"shards": [
{
"shardName": "shard-1",
"numOrphanedDocs": 0,
"numOwnedDocuments": 6,
"ownedSizeBytes": 366,
"orphanedSizeBytes": 0
},
{
"shardName": "shard-2",
"numOrphanedDocs": 0,
"numOwnedDocuments": 6,
"ownedSizeBytes": 366,
"orphanedSizeBytes": 0
}
]
}
]

确保集群中每个分片的 "numOrphanedDocs"0

3

运行以下命令以删除索引:

db.collection.dropIndex("<index name>")
4

运行以下命令,重启集群上的负载均衡器:

sh.startBalancer()