首页 文章

生产环境 代码中的Mongoose索引

提问于
浏览
97

每个Mongoose documentation for MongooseJSMongoDB / Node.js

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

这似乎指示在部署之前从mongoose中删除自动索引以优化Mongoose,指示Mongo在应用程序启动时转到所有索引,这似乎是有道理的 .

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

Edit: 为了补充,MongoDB为索引提供了良好的documentation,但没有提供为什么或何时应该进行显式索引指令 . 在我看来,编写器应用程序应该在具有现有索引的集合上自动更新索引,并且 ensureIndex 实际上更像是一次性事件(在应用新索引时完成),在这种情况下,Mongoose的 autoIndex 应该在正常的服务器重启下是一个无操作 .

2 回答

  • 32

    我从来没有理解为什么Mongoose文档如此广泛地建议在 生产环境 中禁用 autoIndex . 一旦添加了索引,后续的 ensureIndex 调用将只看到索引已经存在然后返回 . 因此,当您第一次创建索引时,它只对性能产生影响,并且此时集合通常为空,因此无论如何创建索引都会很快 .

    我的建议是启用 autoIndex ,除非你有特定情况's giving you trouble; like if you want to add a new index to an existing collection that has millions of docs and you want more control over when it'创建 .

  • 100

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

    如果您的应用程序包含ensureIndex()操作,并且其他操作问题不存在索引,则构建索引会对数据库的性能产生严重影响 . 为避免出现性能问题,请确保应用程序在启动时使用getIndexes()方法或驱动程序的等效方法检查索引,并在不存在正确的索引时终止 . 始终在指定的维护时段使用单独的应用程序代码在 生产环境 实例中构建索引 .

    当然,这实际上取决于您的应用程序的结构和部署方式 . 例如,如果要部署到Heroku,并且您不是_107737,那么很可能您的应用程序在启动期间根本不提供请求,因此在那时创建索引可能是安全的 .

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

    因此,当您第一次创建索引时,它只对性能产生影响,并且此时集合通常为空,因此无论如何创建索引都会很快 .

    如果您已经设法在第一时间获得数据模型和查询,那么这很好,通常情况就是如此 . 但是,如果要向应用程序添加新功能,并在没有索引的属性上使用新的数据库查询,您通常会发现自己在包含许多现有文档的集合中添加索引 .

    这是您需要注意添加索引的时候,并仔细考虑这样做的性能影响 . 例如,你可以create the index in the background

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

相关问题