生产代码中的猫鼬索引

根据MongooseJSMongoDB / Node.js的Mongoose文档:

当您的应用程序启动时,Mongoose将自动为您的模式中定义的每个索引调用ensureIndex 。 尽管开发很好,但建议在生产中禁用此行为,因为索引创建可能会对性能产生重大影响。 将架构的autoIndex选项设置为false来禁用此行为。

这似乎指示在部署之前从猫鼬中删除自动索引,以优化Mongoose,从而指示Mongo在应用程序启动时通过所有索引进行切换,这似乎是合理的。

在生产代码中处理索引的正确方法是什么? 也许外部脚本应该生成索引? 或者,如果单个应用程序是集合的唯一读取器/写入器,那么ensureIndex是不必要的,因为每次发生数据库写入时它都会继续索引?

编辑:作为补充,MongoDB为如何做索引提供了很好的文档,但不是为什么或何时应该完成显式索引指令。 在我看来,索引应该由ensureIndex器应用程序自动保持在具有现有索引的集合上,并且ensureIndex实际上更多是一次性的事情(当新的索引被应用时完成),在这种情况下,Mongoose的autoIndex应该在正常的服务器重新启动下无法运行。


我从来没有理解为什么Mongoose文档如此广泛地推荐在生产中禁用autoIndex 。 一旦添加了索引,随后的ensureIndex调用将简单地看到索引已经存在,然后返回。 所以当你第一次创建索引时,它只会对性能产生影响,并且在那个时候集合通常是空的,因此无论如何创建索引都会很快。

我的建议是保持autoIndex启用,除非你有一个特定的情况,它给你带来麻烦; 就像如果你想添加一个新的索引到一个拥有数百万个文档的现有集合,并且你想更多地控制它的创建时间。


虽然我同意接受的答案,但值得注意的是,根据MongoDB手册,这不是在生产服务器上添加索引的推荐方式:

如果您的应用程序包含ensureIndex()操作,并且其他操作问题不存在索引,则构建索引可能会严重影响数据库的性能。

为避免性能问题,请确保应用程序在启动时使用getIndexes()方法或驱动程序的等效方法检查索引,并在适当索引不存在时终止。 在指定维护时段内,始终使用不同的应用程序代码在生产实例中构建索引

当然,这取决于您的应用程序的结构和部署方式。 例如,如果您正在部署到Heroku,并且您没有使用Heroku的预引导功能,那么很可能您的应用程序在启动过程中根本没有提供请求,因此当时创建索引可能很安全。

除此之外,从接受的答案:

所以当你第一次创建索引时,它只会对性能产生影响,并且在那个时候集合通常是空的,因此无论如何创建索引都会很快。

如果你已经设法让你的数据模型和查询在第一时间钉牢,这很好,而且经常是这样。 但是,如果您要向应用程序添加新功能,并且在没有索引的属性上使用新的数据库查询,则通常会向包含许多现有文档的集合添加索引。

这时您需要小心添加索引,并仔细考虑这样做的性能影响。 例如,您可以在后台创建索引:

db.ensureIndex({ name: 1 }, { background: true });
链接地址: http://www.djcxy.com/p/60681.html

上一篇: Mongoose indexing in production code

下一篇: NodeJs, Mocha and Mongoose