Docs 菜单

删除哈希分片键索引

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

这可以加快使用哈希分片键分片的集合的数据插入速度。在使用 mongosync 时,这还可以加快数据摄取速度。

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

重要

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