Este documento aborda algunas preguntas comunes sobre los Ãndices de MongoDB. Para más información sobre Ãndices, consulta Ãndices.
¿Cómo creo un Ãndice?
Para crear un Ãndice en una colección, utilice el método db.collection.createIndex(). La creación de un Ãndice es una operación administrativa. En general, las aplicaciones no deberÃan llamar a db.collection.createIndex() en una base regular.
Nota
La creación de Ãndices puede afectar el rendimiento; consulta ¿Cómo afecta la creación de Ãndices al rendimiento de la base de datos?. Los administradores deberÃan considerar las implicaciones de rendimiento antes de crear Ãndices.
¿Cómo afecta la creación de Ãndices al rendimiento de la base de datos?
La creación de Ãndices de MongoDB en una colección poblada requiere un bloqueo exclusivo de lectura-escritura contra la colección. Las operaciones que necesitan un bloqueo de lectura o escritura en la colección deben esperar hasta que el mongod libere el bloqueo.
Para compatibilidad de caracterÃsticas entre versiones (fcv)
"4.2", MongoDB utiliza un proceso de compilación optimizado que únicamente mantiene el bloqueo exclusivo al principio y al final de la creación de Ãndices. El resto del proceso de compilación se adapta a la intercalación de operaciones de lectura y escritura.Para la compatibilidad de caracterÃsticas entre versiones (compatibilidad de caracterÃsticas entre versiones)
"4.0", el proceso por defecto de creación de Ãndices en primer plano mantiene el bloqueo exclusivo para toda la creación del Ãndice.backgroundla creación de Ãndices no toma un bloqueo exclusivo durante el proceso.
Para obtener más información sobre el proceso de creación de Ãndices, consulta Creación de Ãndices en colecciones pobladas.
Las creación de Ãndices en sets de réplicas tienen consideraciones especÃficas de rendimiento y riesgos. Consulta Creación de Ãndices en entornos replicados para obtener más información.
¿Cómo puedo supervisar el avance de la creación de Ãndices?
Para obtener información sobre las operaciones actuales de creación de Ãndices en ejecución, consulta Operaciones de indexación activas.
¿Cómo finalizo una creación de Ãndice?
Para finalizar una creación de Ãndices en curso, utiliza los db.collection.dropIndex() o sus asistentes de shell dropIndex() o dropIndexes. No uses db.killOp() para terminar la creación de Ãndices en curso en sets de réplicas o clústeres particionados.
No puedes terminar una creación de Ãndices replicado en los miembros secundarios de un set de réplicas. Primero debe soltar el Ãndice en el principal. El primario detiene la creación de Ãndices y crea una entrada asociada de oplog de abortIndexBuild. Las secundarias que replican la entrada abortIndexBuild de oplog detienen la creación de Ãndices en progreso y descartan la tarea de compilación.
Para obtener más información, consulte Detener creación de Ãndices en curso.
¿Cómo puedo ver qué Ãndices hay en una colección?
Para enumerar los Ãndices de una colección, utiliza el método db.collection.getIndexes().
¿Cómo puedo saber si una consulta utiliza un Ãndice?
Para inspeccionar cómo MongoDB procesa una consulta, usa el método explain().
¿Cómo determino qué campos debo indexar?
Diversos factores determinan qué campos indexar, incluyendo la selectividad y el soporte para múltiples formas del query. Para obtener más información, consulta Consideraciones operativas para Ãndices y Estrategias de indexación.
¿Cómo puedo ver el tamaño de un Ãndice?
El db.collection.stats() incluye un documento indexSizes que proporciona información sobre el tamaño de cada Ãndice en la colección.
¿Cómo afectan las operaciones de escritura a los Ãndices?
Las operaciones de escritura pueden requerir actualizaciones en los Ãndices:
- Si una operación de escritura modifica un campo indexado, MongoDB actualiza todos los Ãndices que tienen el campo modificado como clave.
Por lo tanto, si tu aplicación realiza muchas operaciones de guardar, los Ãndices podrÃan afectar el rendimiento.
¿Cómo impactan los datos aleatorios en el rendimiento de los Ãndices?
Si una Operación inserta una gran cantidad de datos aleatorios (por ejemplo, Ãndices encriptados) en un campo indexado, el rendimiento de las inserciones puede disminuir. Las inserciones masivas de datos aleatorios generan entradas de Ãndice aleatorias, lo que incrementa el tamaño del Ãndice. Si el Ãndice alcanza un tamaño que requiere que cada inserción aleatoria acceda a una entrada de Ãndice diferente, las inserciones resultan en una alta tasa de desalojo y reemplazo de la caché de WiredTiger. Cuando esto ocurre, el Ãndice deja de estar completamente en caché y se actualiza en el disco, lo que reduce el rendimiento.
Para mejorar el rendimiento de las inserciones masivas de datos aleatorios en campos de Ãndice, puedes:
Descartar el Ãndice y luego volver a crearlo después de insertar los datos aleatorios.
Inserta los datos en una colección vacÃa sin Ãndice.
Crear el Ãndice después de la inserción masiva ordena los datos en memoria y realiza una inserción ordenada en todos los Ãndices.
¿Cuándo debo utilizar una creación de Ãndices en rolling?
Solamente usa una creación continua de Ãndices si tu implementación cumple con uno de los siguientes casos:
Si tu utilización promedio de la CPU excede (N-1)/N-10% donde N es el número de hilos de CPU disponibles para mongod
Si el Ãndice de ocupación de tu caché WiredTiger supera regularmente el 90%
Advertencia
Evita realizar procesos de creación de Ãndices en modo continuo y replicado al mismo tiempo, ya que podrÃa generar problemas inesperados, como compilaciones fallidas y bucles de fallos.
Nota
Si tu implementación no cumple con estos criterios, usa la creación de Ãndices por defecto.
Tip
Con Atlas, puedes escalar temporalmente tu clúster para cumplir con los requisitos de una creación de Ãndices tradicional. Sin embargo, Atlas cobra por escalar tu clúster. Consulte Costos de configuración de clúster para obtener más información.