Indización de mangosta en el código de producción

124

Según la documentación de Mangosta para MongooseJSy MongoDB/ Node.js:

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

Esto parece instruir la eliminación de la indexación automática de la mangosta antes de implementar para optimizar Mongoose de instruir a Mongo para ir y batir 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? ¿Quizás un script externo debería generar índices? ¿O tal vez ensureIndexes 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 DB?

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ícitas. Me parece que los índices deben mantenerse actualizados por las aplicaciones de escritor automáticamente en colecciones con índices existentes y eso ensureIndexes realmente algo más que una vez (hecho cuando se aplica un nuevo índice), en cuyo caso Mongoose autoIndexdebería ser un no operativo bajo un reinicio normal del servidor.

Nick S.
fuente

Respuestas:

135

Nunca he entendido por qué la documentación de Mongoose recomienda tan ampliamente desactivar la autoIndexproducción. Una vez que se ha agregado el índice, las ensureIndexllamadas posteriores simplemente verán que el índice ya existe y luego regresarán. Por lo tanto, solo tiene un efecto en el rendimiento cuando se crea el índice por primera vez, y en ese momento las colecciones a menudo están vacías, por lo que crear un índice sería rápido de todos modos.

Mi sugerencia es dejarla autoIndexhabilitada a menos que tenga una situación específica en la que le esté causando 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 crea.

JohnnyHK
fuente
10
Tengo una pregunta que agregar ... ¿Qué sucede si lo configuro como falso? Entonces se crearán los índices cuando inserte los datos o necesito crearlos explícitamente. Lo siento si esta es una pregunta para novatos, pero sería realmente útil si respondiera.
Saransh Mohapatra
55
@SaranshMohapatra Cuando autoIndexes falso, debe llamar a sureIndexes en su modelo para crear sus índices.
JohnnyHK
¿Entonces tendré que llamarlo cada vez o solo una vez definiendo el modelo?
Saransh Mohapatra
@SaranshMohapatra cuando define (compila) su modelo. Lo hago cuando inicio la aplicación por primera vez. Ahora lo difícil es decidir eliminar todos los índices y recrearlos, en caso de que cambie el esquema.
Moss
3
@JohnnyHK, ¿todavía está de acuerdo con su respuesta ahora que es casi 2016?
Alexander Mills
41

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 generateIndex (), y no existe un índice para otras inquietudes operativas, construir el índice puede tener un impacto severo 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 no existen los índices adecuados. Siempre cree índices en instancias de producción utilizando un código de aplicación separado, durante las ventanas de mantenimiento designadas.

Por supuesto, realmente depende de cómo se estructura y despliega su aplicación. Si está implementando en Heroku, por ejemplo, y no está utilizando la función de prearranque de Heroku , entonces es probable que su aplicación no atienda 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 se crea el índice por primera vez, y en ese momento las colecciones a menudo están vacías, por lo que crear un índice sería rápido de todos modos.

Si ha logrado obtener su modelo de datos y consultas por primera vez, está bien, y a menudo es el caso. Sin embargo, si está agregando una nueva funcionalidad a su aplicación, con una nueva consulta de base de datos 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, podría crear el índice en segundo plano :

db.ensureIndex({ name: 1 }, { background: true });
Tom Spencer
fuente
3
Ok, entonces todo lo que tiene que hacer es NO iniciar su servidor hasta que se hayan activado todas las devoluciones de llamada de Index Index para cada colección.
Alexander Mills
@AlexMills, ¿cómo se asegura eso?
lonelymo
async.each (Object.keys (modelos), función (clave, cb) {modelos [clave] .ensureIndexes (cb)}, cb)
Alexander Mills
simplemente llame a sureIndexes en cada modelo de mangosta, espere a que todos terminen y luego inicie su servidor; También recomiendo esperar a que ocurran las conexiones db antes de iniciar su servidor también
Alexander Mills,
2
ensureIndexYa no hay Hay en createIndexcambio. Estoy en lo cierto?
Jack en blanco
1

use este código de bloque para manejar el modo de producción:

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