sql >> Base de Datos >  >> NoSQL >> MongoDB

¿El índice MongoDB/Mongoose hace que la consulta sea más rápida o la ralentiza?

Lo estás leyendo mal

Está malinterpretando la intención del bloque citado en cuanto a qué .ensureIndex() (ahora en desuso, pero todavía llamado por el código mangosta) en realidad lo hace aquí en el contexto.

En mongoose, usted define un índice a nivel de esquema o modelo según sea apropiado para su diseño. Lo que la mangosta "automáticamente" hace por usted es en la conexión, inspecciona cada modelo registrado y luego llama al .ensureIndex() apropiado. métodos para las definiciones de índice proporcionadas.

¿Qué hace esto realmente?

Bueno, en la mayoría de los casos, después de haber iniciado su aplicación antes y .ensureIndexes() el método que se ejecutó es Absolutamente nada . Eso es un poco exagerado, pero suena más o menos cierto.

Debido a que la definición de índice ya se ha creado en la colección del servidor, una llamada posterior no hace nada. Es decir, no elimina el índice y "re-crea". Entonces, el costo real es básicamente nada, una vez que se ha creado el índice.

Creación de índices

Entonces, dado que mongoose es solo una capa sobre la API estándar, el createIndex() El método contiene todos los detalles de lo que está sucediendo.

Hay algunos detalles a considerar aquí, como que una creación de índice puede ocurrir en el "fondo", y aunque esto es menos intrusivo para su aplicación, tiene su propio costo. En particular, el tamaño del índice de la generación de "fondo" será mayor que si lo construyera en primer plano, bloqueando otras operaciones.

Además, todos los índices tienen un costo, especialmente en términos de uso del disco, así como el costo adicional de escribir la información adicional fuera de los datos de la colección en sí.

Las ventajas de un índice son que es mucho más rápido "buscar" los valores contenidos en un índice que buscar en toda la colección y hacer coincidir las posibles condiciones.

Estas son las "compensaciones" básicas asociadas con los índices.

Patrón de implementación

Volver al bloque citado de la documentación, hay una intención real detrás de este consejo.

Es típico en los patrones de implementación y particularmente con las migraciones de datos hacer las cosas en este orden:

  1. Rellenar datos en colecciones/tablas relevantes
  2. Habilite índices en la recopilación/tabla de datos relevantes para sus necesidades

Esto se debe a que hay un costo relacionado con la creación de índices y, como se mencionó anteriormente, es deseable obtener el tamaño más óptimo de la creación del índice, así como evitar que cada inserción de documento tenga también la sobrecarga de escribir una entrada de índice cuando está haciendo esta "carga" a granel.

Entonces para eso están los índices, esos son los costos y beneficios y se explica el mensaje en la documentación de mongoose.

Sin embargo, en general, sugiero leer sobre Índices de bases de datos por lo que son y lo que hacen. Piensa en entrar a una biblioteca para encontrar un libro. Hay un índice de tarjeta allí en la entrada. ¿Caminas por la biblioteca para encontrar el libro que quieres? ¿O lo busca en el índice de la tarjeta para encontrar dónde está? A alguien le tomó tiempo crear ese índice y también mantenerlo actualizado, pero le ahorra a "usted" el tiempo de caminar por toda la biblioteca solo para poder encontrar su libro.