生产代码中的猫鼬索引

按照猫鼬 文件MongooseJSMongoDB/Node.js:

当应用程序启动时,Mongoose 会自动为模式中的每个已定义索引调用 ensureIndex。虽然对于开发来说很不错,但建议在生产环境中禁用此行为,因为创建索引可能会对性能产生重大影响。通过将架构的 autoIndex选项设置为 false 来禁用该行为。

这似乎指示在部署之前删除来自猫鼬的自动索引,从而优化猫鼬,而不是指示 Mongo 在应用程序启动时遍历所有索引,这似乎是有意义的。

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

编辑: 作为补充,MongoDB 为 怎么做提供了很好的 文件来进行索引,但是不能进行 为什么什么时候的显式索引指令。在我看来,索引应该由编写器应用程序自动更新已有索引的集合,而且 ensureIndex实际上更像是一次性事件(在应用新索引时完成) ,在这种情况下,Mongoose 的 autoIndex在正常的服务器重启下应该是不可操作的。

33651 次浏览

我一直不明白为什么 Mongoose 文档如此广泛地建议在生产环境中禁用 autoIndex。一旦添加了索引,随后的 ensureIndex调用将只看到索引已经存在,然后返回。因此,只有在第一次创建索引时,它才会对性能产生影响,而在那个时候,集合通常是空的,所以无论如何,创建索引都会很快。

我的建议是启用 autoIndex,除非你有一个特定的情况,它给你带来麻烦; 比如,如果你想添加一个新的索引到一个现有的集合,有数以百万计的文档,你想要更多的控制,当它被创建的时候。

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

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

为了避免性能问题,请确保应用程序在启动时使用 getIndexs ()方法或驱动程序的等效方法检查索引,并在适当的索引不存在时终止。在指定的维护窗口期间,始终使用单独的应用程序代码在生产实例中生成索引。

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

除此之外,公认的答案是:

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

如果您已经成功地在第一时间获得了数据模型和查询,那么这很好,而且通常是这种情况。但是,如果您正在向应用程序添加新的功能,并且在没有索引的属性上添加新的 DB 查询,那么您通常会发现自己正在向包含许多现有文档的集合添加索引。

现在需要小心添加索引,并仔细考虑添加索引对性能的影响。例如,你可以 在后台创建索引:

db.ensureIndex({ name: 1 }, { background: true });

使用此块代码处理生产模式:

const autoIndex = process.env.NODE_ENV !== 'production';
mongoose.connect('mongodb://localhost/collection', { autoIndex });