Los índices dan soporte a la ejecución eficiente de las query en MongoDB. Sin índices, MongoDB debe escanear cada documento de una colección para arrojar los resultados de la query. Si existe un índice apropiado para una query, MongoDB utiliza el índice para limitar la cantidad de documentos que debe escanear.
Aunque los índices mejoran el rendimiento de las query, añadir un índice tiene un impacto negativo en el rendimiento de las operaciones de guardado. Para colecciones con una alta proporción de guardado a lectura, los índices son costosos porque cada inserción también debe actualizar cualquier índice.
Casos de uso
Si la aplicación ejecuta las queries repetidamente sobre los mismos campos, se puede crear un índice en esos campos para mejorar el rendimiento. Por ejemplo, se deben considerar las siguientes posibilidades:
Scenario | Tipo de índice |
|---|---|
Los departamentos de recursos humanos a menudo necesitan buscar empleados por su ID de empleado. Puedes crear un índice en el campo ID del empleado para mejorar el rendimiento de la query. | |
Un vendedor a menudo necesita buscar información de clientes por ubicación. La ubicación se almacena en un objeto incrustado con campos como Cuando creas un índice en un documento incrustado, solo las consultas que especifican el documento incrustado completo utilizan el índice. Las consultas sobre un campo específico dentro de un documento no utilizan el índice. | Índice de campo único en un documento incrustado |
Una persona responsable de una tienda de comestibles normalmente necesita buscar artículos del inventario por nombre y cantidad para determinar cuáles están a punto de agotarse. Puedes crear un único índice tanto en los campos de |
Empezar
Puedes crear y gestionar índices en MongoDB Atlas, utilizando un método de driver o con el MongoDB Shell. MongoDB Atlas es el servicio totalmente gestionado para las implementaciones de MongoDB en la nube.
Crear y gestionar índices en MongoDB Atlas
Para las implementaciones alojadas en MongoDB Atlas, puedes crear y gestionar índices con la interfaz de usuario de MongoDB Atlas o Atlas CLI. MongoDB Atlas también incluye un Performance Advisor que recomienda índices para mejorar los query lentos, clasifica los índices sugeridos por impacto y recomienda qué índices descartar.
Para aprender a crear y gestionar índices en la interfaz de usuario de MongoDB Atlas o la Atlas CLI, consulta Crear, ver, descartar y ocultar índices.
Para obtener más información sobre el MongoDB Atlas Performance Advisor, consulta Supervisar y mejorar las query lentas.
Crea y gestiona índices con un método de driver o MongoDB Shell
Puede crear y administrar índices con un método controlador o con MongoDB Shell. Para obtener más información, consulte los recursos de esta página.
Detalles
Los índices son estructuras de datos especiales que almacenan una pequeña parte del conjunto de datos de la colección de forma fácil de recorrer. Los índices de MongoDB utilizan un árbol B. estructura de datos.
El índice almacena el valor de un campo específico o un conjunto de campos, ordenados según el valor del campo. El orden de las entradas del índice permite realizar búsquedas de igualdad eficientes y realizar consultas basadas en rangos. Además, MongoDB puede devolver resultados ordenados mediante el orden del índice.
El siguiente diagrama ilustra una consulta que selecciona y ordena los documentos coincidentes utilizando un índice:
En esencia, los índices en MongoDB son similares a los de otros sistemas de bases de datos. MongoDB define índices a nivel de colección y admite índices en cualquier campo o subcampo de los documentos de una colección.
Default _id Index
MongoDB crea un índice único en el campo _id durante la creación de una colección. El _id índice impide que los clientes inserten dos documentos con el mismo valor en el _id campo. No se puede eliminar este índice en el _id campo.
Nota
En clústeres fragmentados, si no se utiliza el _id campo como clave de fragmento, la aplicación debe garantizar la unicidad de los valores del _id campo para evitar errores. Esto se suele lograr mediante un ObjectId estándar generado automáticamente.
Crear un índice
➤ Usar el menú desplegable Seleccionar lenguaje en la parte superior derecha para establecer el lenguaje de los ejemplos en esta página.
Para crear un índice en Mongo Shell, db.collection.createIndex()utilice.
db.collection.createIndex( <key and index type specification>, <options> )
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
db.collection.createIndex( { name: -1 } )
El método solo crea un índice si aún no existe un índice con la misma db.collection.createIndex() especificación.
Importante
Para crear un índice en una colección en MongoDB Compass, la colección debe contener documentos.
Para crear un índice en MongoDB Compass:
Opcional. Especifique las opciones de índice.
Compass admite las siguientes opciones de índice:
Opción | Descripción | Más información | |
|---|---|---|---|
Construir índice en segundo plano | Si está marcado, asegúrate de que la implementación de MongoDB permanezca disponible durante la operación de creación de índices. | ||
Crear un índice único | Si está marcada, asegúrese de que los campos indexados no almacenen valores duplicados. | ||
Crear TTL | Si está marcada, elimina automáticamente los documentos después de una cantidad específica de segundos desde el valor del campo indexado. | ||
Expresión de filtro parcial | Si se marca, solo se indexan los documentos que coincidan con la expresión de filtro especificada. Por ejemplo, la siguiente expresión de filtro parcial solo indexa documentos donde existe el campo | ||
Utilice la intercalación personalizada | Si está marcada, cree una intercalación personalizada para el índice utilizando las opciones proporcionadas en Compass. | ||
Proyección de comodín | Si está marcada, admite campos desconocidos o arbitrarios que coincidan con la proyección especificada en el índice. |
Para crear un índice con el driver .NET, usa MongoCollection.CreateIndex.
collection.CreateIndex( IndexKeys<collection>.<key and index type specification>, <options> );
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
collection.CreateIndex( IndexKeys<collection>.Descending("name") );
El método MongoCollection.CreateIndex solo crea un índice si aún no existe un índice con la misma especificación.
Para crear un índice mediante el driver de Java asíncrono, utilice com.mongodb.async.client.MongoCollection.createIndex.
collection.createIndex( <key and index type specification>, <options>, <callbackFunction>)
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
collection.createIndex(Indexes.descending("name"), someCallbackFunction());
El método com.mongodb.async.client.MongoCollection.createIndex solo crea un índice si aún no existe un índice con la misma especificación.
Para crear un índice mediante el driver de Java, utilice com.mongodb.client.MongoCollection.createIndex.
collection.createIndex( <key and index type specification>, <options> )
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
collection.createIndex(Indexes.descending("name"));
El método com.mongodb.client.MongoCollection.createIndex. solo crea un índice si aún no existe un índice con la misma especificación.
Para crear un índice mediante el driver de Motor, utilice motor.motor_asyncio.AsyncIOMotorCollection.create_index.
await db.collection.create_index([(<key and index type specification>)], <options> )
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
await collection.create_index([("name", pymongo.DESCENDING)])
El método solo crea un índice si aún no existe un índice con la misma motor.motor_asyncio.AsyncIOMotorCollection.create_index especificación.
Para crear un índice con el Node.js Driver, usa createIndex().
collection.createIndex( { <key and index type specification> }, function(err, result) { console.log(result); callback(result); }
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
collection.createIndex( { name : -1 }, function(err, result) { console.log(result); callback(result); }
El método createIndex() solo crea un índice si aún no existe un índice con la misma especificación.
Para crear un índice mediante el driver de Perl, utilice create_one().
my $indexes = $db->get_collection( <collection> )->indexes; $indexes->create_one( [ <key and index type specification> ] );
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
my $indexes = $db->get_collection( <collection> )->indexes; $indexes->create_one( [ name => -1 ] );
El método create_one() solo crea un índice si aún no existe un índice con la misma especificación.
Para crear un índice usando el driver PHP, usa MongoDB\\Collection::createIndex().
$collection->createIndex(<key and index type specification>, <options>);
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
$collection->createIndex(['name' => -1]);
El método solo crea un índice si aún no existe un índice con la misma MongoDB\\Collection::createIndex() especificación.
Para crear un índice utilizando el controlador Python de PyMongo,pymongo.collection.Collection.create_index utilice.
db.collection.create_index([(<key and index type specification>)], <options> )
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
collection.create_index([("name", pymongo.DESCENDING)])
El método solo crea un índice si aún no existe un índice con la misma pymongo.collection.Collection.create_index especificación.
Para crear un índice mediante el driver de Ruby, utilice Mongo::Index::View#create_one.
client[:collection].indexes.create_one({ <key and index type specification> }, {options})
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
client[:collection].indexes.create_one({ name: -1 })
El método Mongo::Index::View#create_one solo crea un índice si no existe ya un índice con la misma especificación.
Para crear un índice usando el Scala driver, utilice org.mongodb.scala.model.Indexes.
collection.createIndex(<key and index type specification>)
El siguiente ejemplo crea un índice descendente de clave única en el campo name:
collection.createIndex(descending("name"))
El método org.mongodb.scala.model.Indexes solo crea un índice si aún no existe un índice con la misma especificación.
| [1] | Los índices de MongoDB utilizan una estructura de datos B-tree. |
Nombres de índices
El nombre por defecto de un índice es la concatenación de las claves indexadas y la dirección de cada clave en el índice (es decir, 1 o -1) utilizando guiones bajos como separador. Por ejemplo, un índice creado en { item : 1, quantity: -1 } tiene el nombre item_1_quantity_-1.
Puede crear índices con un nombre personalizado, por ejemplo, uno más legible que el predeterminado. Por ejemplo, considere una aplicación que consulta frecuentemente la products colección para rellenar datos del inventario existente. El siguiente método crea un índice createIndex() en item y quantity query for
inventoryllamado:
db.products.createIndex( { item: 1, quantity: -1 } , { name: "query for inventory" } )
Puede ver los nombres de los índices mediante el db.collection.getIndexes() método. No es posible cambiar el nombre de un índice una vez creado. En su lugar, debe eliminarlo y volver a crearlo con un nuevo nombre.
Tipos de índice
MongoDB proporciona varios tipos de índices diferentes para admitir tipos específicos de datos y consultas.
Campo único
Además del _id índice definido por MongoDB, MongoDB admite la creación de índices ascendentes/descendentes definidos por el usuario en un solo campo de un documento.
Para un índice de un solo campo y operaciones de ordenación, el orden de clasificación (es decir, ascendente o descendente) de la clave del índice no importa porque MongoDB puede recorrer el índice en cualquier dirección.
Consulte Índices de campo único y Ordenar con un índice de campo único para obtener más información sobre los índices de campo único.
Índice compuesto
MongoDB también admite índices definidos por el usuario en múltiples campos, es decir, índicescompuestos.
El orden de los campos enumerados en un índice compuesto es importante. Por ejemplo, si un índice compuesto consta de { userid: 1, score: -1 }, el índice ordena primero por userid y luego, dentro de cada valor userid, ordena por score.
Para índices compuestos y operaciones de ordenamiento, el orden de clasificación (es decir, ascendente o descendente) de las claves del índice puede determinar si el índice puede soportar una operación. Consulta Sort Order para obtener más información sobre el impacto del orden del índice en los resultados de los índices compuestos.
Véase también:
Multikey Index
MongoDB utiliza índices multiclave para indexar el contenido almacenado en matrices. Si indexa un campo que contiene un valor de matriz, MongoDB crea entradas de índice independientes para cada elemento único de la matriz. Estos índices multiclave permiten que las consultas seleccionen documentos que contienen matrices mediante la coincidencia con el elemento o los elementos de las matrices. MongoDB determina automáticamente si se crea un índice multiclave si el campo indexado contiene un valor de matriz; no es necesario especificar explícitamente el tipo de multiclave.
Consulte Índices multiclave y Límites de índices multiclave para obtener más información sobre los índices multiclave.
Índice geoespacial
Para soportar consultas eficientes de datos de coordenadas geoespaciales, MongoDB proporciona dos índices especiales: 2índices d que utilizan geometría plana al devolver resultados e 2índices dsphere que utilizan geometría esférica para devolver resultados.
Este índice es disperso. Si desea utilizar un índice disperso para crear un índice compuesto, revise primero las consideraciones especiales para el uso de índices compuestos dispersos.
Consulte Índices geoespaciales para obtener una introducción de alto nivel a los índices geoespaciales.
Índices de búsqueda de texto
Para los datos alojados en MongoDB Atlas, puede realizar búsquedas de texto completo con los índices de Atlas Search. Para obtener más información, consulte Crear un índice de Atlas Search.
Para las implementaciones autogestionadas (que no son de Atlas), MongoDB proporciona un tipo de índice text que admite la búsqueda de contenido de string en una colección. Para aprender más sobre los índices de texto autogestionados, consulta Índices de texto en implementaciones autogestionadas.
Este índice es disperso. Si desea utilizar un índice disperso para crear un índice compuesto, revise primero las consideraciones especiales para el uso de índices compuestos dispersos.
Índices encriptados
Para apoyar la particionado basada en hash, MongoDB proporciona un tipo de índice encriptada, que indexa el hash del valor de un campo. Estos índices presentan una distribución más aleatoria de valores a lo largo de su rango, pero solo admiten coincidencias exactas y no pueden admitir consultas basadas en rangos.
Índices agrupados
A partir de MongoDB 5.3, puedes crear una colección con un índice agrupado. Las colecciones creadas con un índice de clústeres se denominan colecciones con índice clusterizado.
Consultar Colecciones con índice clusterizado.
Índices comodín
A partir de MongoDB 4.2, puede utilizar índices comodín para soporte de querys en varios campos, arbitrarios o desconocidos. Cuando creas un índice comodín, especificas $** para representar todos los campos o todos los valores, lo que te permite indexar cualquiera de los siguientes con un solo comando:
Todos los valores de un campo
Todos los campos de un documento
Todos los campos de un documento excepto las rutas de campos específicos
Múltiples campos específicos en un documento
Para obtener más información, consulte Índices comodín.
Propiedades del índice
Unique Indexes
La propiedad única de un índice hace que MongoDB rechace valores duplicados para el campo indexado. Salvo por la restricción única, los índices únicos son funcionalmente intercambiables con otros índices de MongoDB.
Índices parciales
Los índices parciales solo indexan los documentos de una colección que cumplen una expresión de filtro específica. Al indexar un subconjunto de los documentos de una colección, los índices parciales requieren menos almacenamiento y reducen los costes de rendimiento para su creación y mantenimiento.
Los índices parciales ofrecen un superconjunto de la funcionalidad de los índices dispersos y deberían preferirse a los índices dispersos.
Sparse Indexes
La propiedad dispersa de un índice garantiza que este solo contenga entradas de documentos que tengan el campo indexado. El índice omite los documentos que no lo tengan.
Puede combinar la opción de índice disperso con la opción de índice único para evitar la inserción de documentos que tengan valores duplicados para los campos indexados y omitir la indexación de documentos que carezcan de los campos indexados.
TTL Indexes
Los índices TTL son índices especiales que MongoDB puede usar para eliminar automáticamente documentos de una colección después de un tiempo determinado. Esto es ideal para ciertos tipos de información, como datos de eventos generados por máquina, registros e información de sesión, que solo necesitan persistir en una base de datos durante un tiempo determinado.
Consulte: Hacer caducar datos de colecciones mediante la configuración de TTL para obtener instrucciones de implementación.
Hidden Indexes
Nuevo en la versión 4.4.
Los índices ocultos no son visibles para el planificador de consultas y no se pueden utilizar para respaldar una consulta.
Al ocultar un índice del planificador, los usuarios pueden evaluar el impacto potencial de eliminar un índice sin eliminar realmente el índice. Si el impacto es negativo, el usuario puede desocultar el índice en lugar de tener que recrear un índice descartado. Y como los índices se mantienen completamente mientras están ocultos, los índices están inmediatamente disponibles para ser usados una vez que se desocultan.
A excepción del índice _id, puede ocultar cualquier índice.
Uso del índice
Los índices pueden mejorar la eficiencia de las operaciones de lectura. El tutorial "Analizar el rendimiento de consultas" ofrece un ejemplo de las estadísticas de ejecución de una consulta con y sin índice.
Para obtener información sobre cómo MongoDB elige un índice a utilizar, consulta optimizador del query.
Índices y intercalación
La intercalación permite a los usuarios especificar reglas propias del lenguaje para la comparación de strings, como reglas para el uso de mayúsculas y minúsculas y marcas de acento.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de MongoDB Compass para obtener instrucciones sobre el uso de la intercalación personalizada con índices en Compass.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Nota
Los siguientes ejemplos ilustran índices y intercalaciones mongosh en.
Consulte la documentación de su controlador para obtener instrucciones sobre cómo crear índices con intercalación en su controlador específico.
Para utilizar un índice para las comparaciones de cadenas, una operación también debe especificar la misma intercalación. Es decir, un índice con una intercalación no puede soportar una operación que realice comparaciones de strings en los campos indexados si la operación especifica una intercalación diferente.
Advertencia
Debido a que los índices configurados con intercalación utilizan claves de intercalación ICU para lograr el orden de clasificación, las claves de índice que consideran la intercalación pueden ser más grandes que las claves de índice para los índices sin intercalación.
Una colección restaurants tiene los siguientes documentos:
db.restaurants.insertMany( [ { _id: 1, category: "café", status: "Open" }, { _id: 2, category: "cafe", status: "open" }, { _id: 3, category: "cafE", status: "open" } ] )
La colección restaurants tiene un índice en un campo de string category con la intercalación de la localización "fr".
db.restaurants.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
La siguiente query, que especifica la misma intercalación que el índice, puede utilizar el índice:
db.restaurants.find( { category: "cafe" } ).collation( { locale: "fr" } )
Sin embargo, la siguiente operación de query, que por defecto utiliza el intercalador binario "simple", no puede usarse el índice:
db.restaurants.find( { category: "cafe" } )
Para un índice compuesto donde las claves prefijo del índice no son cadenas, arreglos ni documentos incrustados, una operación que especifique una intercalación diferente puede seguir utilizando el índice para soportar comparaciones en las claves prefijo del índice.
Por ejemplo, la colección restaurants tiene un índice compuesto en los campos numéricos score y price y el campo de string category; el índice se crea con la localización de intercalación "fr" para comparaciones de strings:
db.restaurants.createIndex( { score: 1, price: 1, category: 1 }, { collation: { locale: "fr" } } )
Las siguientes operaciones, que utilizan la intercalación binaria "simple" para las comparaciones de strings, pueden usar el índice:
db.restaurants.find( { score: 5 } ).sort( { price: 1 } ) db.restaurants.find( { score: 5, price: { $gt: Decimal128( "10" ) } } ).sort( { price: 1 } )
La siguiente operación, que utiliza la intercalación binaria "simple" para las comparaciones de string en el campo category indexado, puede usar el índice para cumplir solo con la parte score: 5 de la query:
db.restaurants.find( { score: 5, category: "cafe" } )
Para confirmar si una consulta ha utilizado un índice, ejecuta la consulta con la opción explain().
Importante
Las coincidencias con claves de documentos, incluidas las claves de documentos incrustadas, utilizan una comparación binaria simple. Esto significa que una query para una clave como "type.café" no coincidirá con la clave "type.cafe", independientemente del valor que se establezca para el parámetro strength.
Para obtener más información sobre la intercalación, consulte la página de referencia de intercalación.
Los siguientes índices solo soportan la comparación binaria simple y no soportan la intercalación:
text indexes,
2d índices, y
geoHaystack indexes.
Consultas cubiertas
Cuando los criterios de consulta y la proyección de una consulta incluyen únicamente los campos indexados, MongoDB devuelve los resultados directamente del índice sin escanear documentos ni almacenarlos en memoria. Estas consultas cubiertas pueden ser muy eficientes.
Para obtener más información sobre las consultas cubiertas, consulte Ejecutar consultas cubiertas.
Intersección del índice
MongoDB puede usar la intersección de índices para completar consultas. En consultas que especifican condiciones de consulta compuestas, si un índice puede cumplir una parte de la condición y otro índice puede cumplir otra parte, MongoDB puede usar la intersección de ambos índices para completar la consulta. La eficiencia de usar un índice compuesto o una intersección de índices depende de la consulta y del sistema.
Para obtener detalles sobre la intersección de índices, consulte Intersección de índices.
Restricciones
Se aplican ciertas restricciones a los índices, como la longitud de las claves o el número de índices por colección. Consulte Limitaciones de índices para obtener más información.
Consideraciones adicionales
Si bien los índices pueden mejorar el rendimiento de las consultas, también presentan algunas consideraciones operativas.Consulte "Consideraciones operativas para índices" para obtener más información.
Durante la creación de índices, las aplicaciones pueden experimentar un rendimiento reducido o acceso de lectura/escritura limitado a la colección que se está indexando.
Para obtener más información sobre el proceso de creación de índices, consulte Creaciones de índices en colecciones pobladas, especialmente la sección Creaciones de índices en entornos replicados.
Algunos controladores usan Long(1) en lugar de 1 para especificar el orden del índice. Los índices resultantes son los mismos.