Mongoose indexing in production code
Problem
Per the Mongoose documentation for MongooseJS
and MongoDB
/Node.js
:
When your application starts up, Mongoose automatically calls
ensureIndex
for each defined index in your schema. While nice for development, it is recommended this behavior be disabled in production since index creation can cause a significant performance impact. Disable the behavior by setting theautoIndex
option of your schema to false.
This appears to instruct removal of auto-Indexing from mongoose prior to deploying to optimize Mongoose from instructing Mongo to go and churn through all indexes on application startup, which seems to make sense.
What is the proper way to handle indexing in production code? Maybe an external script should generate indexes? Or maybe ensureIndex
is unnecessary if a single application is the sole reader/writer to a collection because it will continue an index every time a DB write occurs?
Edit: To supplement, MongoDB provides good documentation for the how to do indexing, but not why or when explicit indexing directives should be done. It seems to me that indexes should be kept up to date by writer applications automatically on collections with existing indexes and that ensureIndex
is really more of a one-time thing (done when a new index is being applied), in which case Mongoose's autoIndex
should be a no-op under a normal server restart.
Solution
I've never understood why the Mongoose documentation so broadly recommends disabling autoIndex
in production. Once the index has been added, subsequent ensureIndex
calls will simply see that the index already exists and then return. So it only has an effect on performance when you're first creating the index, and at that time the collections are often empty so creating an index would be quick anyway.
My suggestion is to leave autoIndex
enabled unless you have a specific situation where it'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's created.
Discussion
View additional discussion.