删除不必要的索引
Overview
索引支持在MongoDB中高效执行查询。 但是,您创建的每个索引都会对写入产生负面性能影响,并且需要一些磁盘空间。
创建不必要的索引会导致集合臃肿和写入速度缓慢。考虑应用程序执行的每个查询,以及是否需要索引。删除未使用的索引,因为该字段未用于查询数据库或者索引是冗余的。
您应该识别并删除不必要的索引。 使用 数据浏览器管理MongoDB Ops Manager中的索引。
例子
考虑一款向玩家奖励 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
Index
在此示例中,当游戏在数据库中查询玩家信息时,会找到一条使用玩家全名的记录。 复合索引{ last_name: 1,
first_name: 1 }
涵盖了这种情况,因此游戏应删除索引{ last_name: 1 }
,因为它是多余的。
coins
Index
在此示例中,coins
字段从不用于搜索数据库。游戏应删除索引 { coins: -1 }
,因为它未被使用。
stars
Index
在此示例中,在游戏结束时,玩家的姓名按照星星数量降序显示在排行榜上。游戏应维护索引 { stars: -1 }
(即使不经常使用),以避免扫描 players
集合中的每个文档。
现在,游戏使用以下索引:
_id
默认情况下已编制索引。{ last_name: 1, first_name: 1 }
{ stars: -1 }
删除不必要的索引后,players
集合将拥有更多可用空间,并且写入速度更快。最频繁的读取不会出现性能下降,因为支持这些读取的索引仍然存在于集合中。
识别并删除不必要的索引
要识别 Ops Manager 中不必要的索引,请使用数据浏览器查看索引。
在数据浏览器的 Indexes(索引)标签页下,您可以查看每个索引的 Size(大小)、Usage(用法)和其他信息。如果一个索引未使用或被另一个索引覆盖,则应将其删除。
要在 Ops Manager 中删除索引,请使用数据浏览器删除索引。