与MongoDB合作了一段时间,今天我在与同事讨论时遇到了疑问。
问题是,当您在MongoDB中创建索引时,将处理该集合并构建索引。
索引在文档的插入和删除过程中更新,因此我真的不需要运行重建索引操作(删除索引然后重建索引)。
根据MongoDB文档:
通常,MongoDB在例行更新期间压缩索引。对于大多数 用户,reIndex命令是不必要的。但是,这可能是值得的 如果集合大小发生了显着变化或者如果是,则运行 索引正在消耗不成比例的磁盘空间。
是否有人需要运行值得的重建索引操作?
答案 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: