为什么以及何时需要在MongoDB中重建索引?

时间:2015-05-20 09:11:00

标签: mongodb indexing theory fragmentation

与MongoDB合作了一段时间,今天我在与同事讨论时遇到了疑问。

问题是,当您在MongoDB中创建索引时,将处理该集合并构建索引。

索引在文档的插入和删除过程中更新,因此我真的不需要运行重建索引操作(删除索引然后重建索引)。

根据MongoDB文档:

  

通常,MongoDB在例行更新期间压缩索引。对于大多数   用户,reIndex命令是不必要的。但是,这可能是值得的   如果集合大小发生了显着变化或者如果是,则运行   索引正在消耗不成比例的磁盘空间。

是否有人需要运行值得的重建索引操作?

1 个答案:

答案 0 :(得分:11)

根据MongoDB文档,通常不需要定期重建索引。

注意:MongoDB 3.0+引入了pluggable storage engine API,对存储的任何建议都会变得更有趣。我在下面的评论是专门参考MongoDB 3.0及更早版本中的默认MMAP存储引擎。 WiredTiger和其他存储引擎具有不同的数据存储实现方式。索引。

如果符合以下条件,使用MMAP存储引擎重建索引可能会有一些好处:

  • 与数据相比,索引占用的空间量大于预期。注意:您需要监控历史数据和索引大小,以便进行比较。

  • 您希望从较旧的索引格式迁移到较新的索引格式。如果建议使用reindex,则会在升级说明中提及。例如,MongoDB 2.0引入了重要的index performance improvements,因此发行说明包括升级后建议的v2.0格式重新索引。类似地,MongoDB 2.6引入了2dsphere (v2.0) indexes,它具有不同的默认行为(默认为稀疏)。索引版本升级后不会重建现有索引;是否/何时升级的选择由数据库管理员决定。

  • 您已将集合的_id格式更改为单调递增键(例如ObjectID)或从随机值更改。这有点深奥,但是如果你要插入总是在增加的_id,那么会有一个索引优化来分割b-tree桶90/10(而不是50/50)(ref:{{ 3}})。如果_id的性质发生重大变化,则可能会构建一个带有重新索引的更高效的b树。

有关常规B树行为的详细信息,请参阅:SERVER-983

可视化索引使用

如果您真的很想要深入了解索引内部,可以尝试一些实验性命令/工具。我预计这些仅限于MongoDB 2.4&仅限2.6: