Indice de mongoose en el código de producción

Según la documentación de MongooseJS para MongooseJS y MongoDB / Node.js :

Cuando se inicia la aplicación, Mongoose llama automáticamente a ensureIndex para cada índice definido en su esquema. Si bien es bueno para el desarrollo, se recomienda que este comportamiento se deshabilite en producción, ya que la creación de índices puede causar un impacto significativo en el rendimiento. Deshabilite el comportamiento estableciendo la opción autoIndex de su esquema en falso.

Esto parece indicar la eliminación de la auto-indexación de la mongoose antes de la implementación para optimizar Mongoose de instruir a Mongo para ir y agitar todos los índices en el inicio de la aplicación, lo que parece tener sentido.

¿Cuál es la forma correcta de manejar la indexación en el código de producción? ¿Tal vez un script externo debería generar índices? ¿O tal vez ensureIndex que el ensureIndex es innecesario si una sola aplicación es el único lector / escritor de una colección porque continuará un índice cada vez que se produzca una escritura de base de datos?

Editar: para complementar, MongoDB proporciona una buena documentación sobre cómo hacer la indexación, pero no por qué o cuándo se deben hacer las directivas de indexación explícita. Me parece que los índices deben mantenerse actualizados por las aplicaciones de escritorios automáticamente en las colecciones con índices existentes y que ensureIndex es realmente algo más que una vez (hecho cuando se aplica un nuevo índice), en cuyo caso el autoIndex de autoIndex debería ser un no-operativo bajo un reinicio normal del servidor.

Nunca entendí por qué la documentación de Mongoose recomienda ampliamente la desactivación de autoIndex en la producción. Una vez que se haya agregado el índice, las llamadas subsiguientes de ensureIndex simplemente verán que el índice ya existe y luego regresará. Por lo tanto, solo tiene un efecto en el rendimiento cuando crea el índice por primera vez, y en ese momento las colecciones suelen estar vacías, por lo que la creación de un índice sería rápida de todos modos.

Mi sugerencia es dejar autoIndex habilitado a menos que tenga una situación específica en la que le esté autoIndex problemas; por ejemplo, si desea agregar un nuevo índice a una colección existente que tiene millones de documentos y desea tener más control sobre cuándo se creó.

Aunque estoy de acuerdo con la respuesta aceptada, vale la pena señalar que, de acuerdo con el manual de MongoDB , esta no es la forma recomendada de agregar índices en un servidor de producción:

Si su aplicación incluye operaciones de ensureIndex () y no existe un índice para otras cuestiones operativas, la construcción del índice puede tener un impacto grave en el rendimiento de la base de datos.

Para evitar problemas de rendimiento, asegúrese de que su aplicación verifique los índices al inicio utilizando el método getIndexes () o el método equivalente para su controlador y finalice si los índices apropiados no existen. Siempre cree índices en las instancias de producción usando un código de aplicación separado, durante las ventanas de mantenimiento designadas.

Por supuesto, realmente depende de cómo esté estructurada y desplegada su aplicación. Si se está implementando en Heroku, por ejemplo, y no está utilizando la función prearranque de Heroku, es probable que su aplicación no esté atendiendo solicitudes durante el inicio, por lo que probablemente sea seguro crear un índice en ese momento.

Además de esto, de la respuesta aceptada:

Por lo tanto, solo tiene un efecto en el rendimiento cuando crea el índice por primera vez, y en ese momento las colecciones suelen estar vacías, por lo que la creación de un índice sería rápida de todos modos.

Si logró obtener su modelo de datos y las consultas clavadas la primera vez, esto está bien, y a menudo es el caso. Sin embargo, si agrega nuevas funcionalidades a su aplicación, con una nueva consulta DB en una propiedad sin índice, a menudo se encontrará agregando un índice a una colección que contiene muchos documentos existentes.

Este es el momento en que debe tener cuidado al agregar índices, y considerar cuidadosamente las implicaciones de rendimiento de hacerlo. Por ejemplo, puede crear el índice en segundo plano :

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