Docs 菜单

Docs 主页启动和管理 MongoDBMongoDB Atlas

删除不必要的索引

在此页面上

  • 概述
  • 例子
  • 识别并删除不必要的索引
  • 了解详情

索引支持在 MongoDB 中高效执行查询。但是,您创建的每个索引都会对写入产生负面性能影响,并且需要一些磁盘空间。

创建不必要的索引会导致集合臃肿和写入速度缓慢。考虑应用程序执行的每个查询,以及是否需要索引。删除未使用的索引,因为该字段未用于查询数据库或者索引是冗余的。

您应该识别并删除不必要的索引。使用Atlas 用户界面管理 Atlas 中的索引。

考虑一款向玩家奖励 coins 的游戏。当玩家达到 20 coins 时,该玩家将获得 1 star,并且其 coins 重置为 0。游戏有一个 players 集合,其中包含如下文档:

// players collection
{
"_id": "ObjectId(123)",
"first_name": "John",
"last_name": "Doe",
"coins": 11,
"stars": 2
}

players 集合具有针对每个字段的索引:

  • _id 默认情况下已编制索引。

  • { last_name: 1 }

  • { last_name: 1, first_name: 1 }

  • { coins: -1 }

  • { stars: -1 }

在此示例中,当游戏在数据库中查询玩家信息时,会找到一条使用玩家全名的记录。 复合索引{ last_name: 1, first_name: 1 }涵盖了这种情况,因此游戏应删除索引{ last_name: 1 } ,因为它是多余的。

在此示例中,coins 字段从不用于搜索数据库。游戏应删除索引 { coins: -1 },因为它未被使用。

在此示例中,在游戏结束时,玩家的姓名按照星星数量降序显示在排行榜上。游戏应维护索引 { stars: -1 }(即使不经常使用),以避免扫描 players 集合中的每个文档。

现在,游戏使用以下索引:

  • _id 默认情况下已编制索引。

  • { last_name: 1, first_name: 1 }

  • { stars: -1 }

删除不必要的索引后,players 集合将拥有更多可用空间,并且写入速度更快。最频繁的读取不会出现性能下降,因为支持这些读取的索引仍然存在于集合中。

要识别 Atlas 中不必要的索引,请使用 Atlas 用户界面查看索引

在数据浏览器的 Indexes(索引)标签页下,您可以查看每个索引的 Size(大小)、Usage(用法)和其他信息。如果一个索引未使用或被另一个索引覆盖,则应将其删除。

要在 Atlas 中删除索引,请使用 Atlas 用户界面删除索引

  • 要了解有关索引的更多信息,请参阅索引。

  • 要了解有关为您的使用案例建立索引的更多信息,请参阅索引策略。

  • MongoDB 还提供有关提高数据库性能(包括优化索引)的免费 MongoDB 大学课程: 监控和见解。

← 避免无界数组