Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/
Manual de base de datos

Indexes

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.

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.

Índice de un solo campo

Un vendedor a menudo necesita buscar información de clientes por ubicación. La ubicación se almacena en un objeto incrustado con campos similares state, city y zipcode. Puede crear un índice en el objeto location para mejorar el rendimiento de las consultas sobre ese objeto.

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 item como en quantity para mejorar el rendimiento de la query.

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.

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.

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.

Los índices son estructuras de datos especiales que almacenan una pequeña porción del conjunto de datos de la colección en una forma fácil de recorrer. Los índices de MongoDB utilizan un B-tree 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 query que selecciona y ordena los documentos coincidentes usando un índice:

Diagrama de una consulta que utiliza un índice para seleccionar y devolver resultados ordenados. El índice almacena los valores de ``score`` en orden ascendente. MongoDB puede recorrer el índice en orden ascendente o descendente para devolver resultados ordenados.
haga clic para ampliar

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.

MongoDB crea un índice único en el campo _id durante la creación de una colección. El índice _id impide que los clientes inserten dos documentos con el mismo valor para el campo _id. No se puede eliminar este índice en el campo _id.

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.


➤ 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 db.collection.createIndex() sólo crea un índice si no existe ya un índice de la misma 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:

1
  1. En el panel de navegación izquierdo de MongoDB Compass, haz clic en la base de datos que contiene la colección deseada.

  2. Desde la vista de la base de datos, haga clic en el nombre de la colección objetivo.

2

Desde la pestaña Índices, haga clic en el botón Create Index para abrir el cuadro de diálogo Create Index.

3

En el cuadro de diálogo, ingresa el nombre del índice a crear o déjalo en blanco para que MongoDB cree un nombre por defecto para el índice.

4

Para especificar una clave para el índice, selecciona el campo y el tipo de índice. Para indexar campos adicionales, haz clic en Add Another Field.

5

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 se selecciona, 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 timezone:

{ "timezone": { "$exists": true } }

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á seleccionado, admite campos desconocidos o arbitrarios que coincidan con la proyección especificada en el índice.

6

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 únicamente crea un índice si no existe ya otro de 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 com.mongodb.client.MongoCollection.createIndex. el método 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 motor.motor_asyncio.AsyncIOMotorCollection.create_index método solo crea un índice si aún no existe un índice con las mismas especificaciones.

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 no existe ya 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 MongoDB\\Collection::createIndex() solo crea un índice si no existe ya un índice de la misma especificación.

Para crear un índice utilizando el controlador Python PyMongo, utilice pymongo.collection.Collection.create_index.

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 pymongo.collection.Collection.create_index método solo crea un índice si aún no existe un índice con las mismas especificaciones.

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 sólo crea un índice si no existe ya un índice con la misma especificación.

[1] Los índices de MongoDB utilizan una estructura de datos B-tree.

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.

Se pueden crear índices con un nombre personalizado, como uno que sea más amigable para los humanos que el por defecto. Por ejemplo, considere una aplicación que hace query con frecuencia la colección products para poblar datos sobre el inventario existente. El siguiente método createIndex() crea un índice en item y quantity llamado query for inventory:

db.products.createIndex(
{ item: 1, quantity: -1 } ,
{ name: "query for inventory" }
)

Puedes ver los nombres de índice utilizando el método db.collection.getIndexes(). No puedes renombrar un índice una vez creado. En su lugar, debes descartar y volver a crear el índice con un nuevo nombre.

MongoDB proporciona varios tipos de índices diferentes para admitir tipos específicos de datos y query.

Además del índice _id definido por MongoDB, MongoDB admite la creación de índices ascendentes/descendentes definidos por el usuario en un solo campo de un documento.

Diagrama de un índice en el campo "puntuación" (ascendente).

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.

Consulta Índices de campo único y Ordenar con un índice de campo único para más información sobre los índices de campo único.

MongoDB también soporta índices definidos por el usuario en varios campos, es decir, índices compuestos.

El orden de campos listados en un índice compuesto tiene importancia. Por ejemplo, si un índice compuesto consta de { userid: 1, score: -1 }, el índice ordena primero por userid y luego, dentro de cada valor de userid, ordena por score.

Diagrama de un índice compuesto en el campo ``userid`` (ascendente) y en el campo ``score`` (descendente). El índice clasifica primero por el campo ``userid`` y luego por el campo ``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:

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.

Diagrama de un índice multiclave en el campo ``addr.zip`` . El campo ``addr`` contiene un arreglo de documentos de dirección. Los documentos de dirección contienen el campo ``zip``.

Consulta Índices Multiclave y Límites de índice multiclave para obtener más información sobre índices multiclave.

Para respaldar consultas eficientes de datos de coordenadas geoespaciales, MongoDB proporciona dos índices especiales: índices 2D que utilizan geometría plana al devolver resultados e índices 2Dsphere que utilizan geometría esférica para devolver resultados.

Este índice es un índice disperso. Si quieres utilizar un índice disperso para crear un índice compuesto, primero revisa las consideraciones especiales de usar índices compuestos dispersos.

Consulte Índices geoespaciales para obtener una introducción de alto nivel a los índices geoespaciales.

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 un índice disperso. Si quieres utilizar un índice disperso para crear un índice compuesto, primero revisa las consideraciones especiales de usar índices compuestos dispersos.

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.

A partir de MongoDB 5.3, puedes crear una colección con un índice clusterizado. Las colecciones creadas con un índice agrupado se llaman colecciones agrupadas.

Consultar Colecciones con índice clusterizado.

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 campo específicas

  • Varios campos específicos en un documento

Para obtener más información, consulta Índices comodín.

La propiedad única para un índice hace que MongoDB rechace valores duplicados para el campo indexado. Aparte de la restricción de unicidad, los índices únicos son funcionalmente intercambiables con otros índices de MongoDB.

Los índice parciales solo indexan los documentos de una colección que cumplen una expresión de filtro especificada. Al realizar la indexación de un subconjunto de los documentos en una colección, los índices parciales tienen menores requisitos de almacenamiento y reducidos costos de rendimiento para la creación y el mantenimiento del índice.

Los índices parciales ofrecen un conjunto más amplio de funcionalidades que los índices dispersos, y se deben preferir sobre estos últimos.

La propiedad sparse de un índice garantiza que el índice solo contenga entradas para los documentos que tengan el campo indexado. El índice omite los documentos que no tienen el campo indexado.

Puedes 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 el (los) campo(s) indexados y omitir la indexación de documentos que carezcan del (los) campo(s) indexados.

Los índices TTL son índices especiales que MongoDB puede usar para remover automáticamente documentos de una colección después de una cierta cantidad de tiempo. Esto es ideal para ciertos tipos de información como los datos de eventos generados por máquinas, registros e información de sesiones que sólo necesitan permanecer en una base de datos por una cantidad de tiempo finita.

Consulta: Expirar datos de las colecciones configurando TTL para obtener instrucciones de implementación.

Nuevo en la versión 4.4.

Los índices ocultos no son visibles para el planificador de queries y no se pueden utilizar para respaldar una query.

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.

Excepto para el índice _id, puedes ocultar cualquier í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.

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.

Consulta la Documentación de MongoDB Compass para obtener instrucciones sobre cómo usar 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, consulta la página de referencia sobre intercalación.

Los siguientes índices solo soportan la comparación binaria simple y no soportan la intercalación:

Cuando los criterios de la query y la proyección de una query incluyen solo los campos indexados, MongoDB retorna los resultados directamente desde el índice sin escanear ningún documento ni cargar documentos en la memoria. Estas consultas cubiertas pueden ser muy eficientes.

Diagrama de una query que utiliza únicamente el índice para cumplir los criterios de query y devolver los resultados. MongoDB no necesita inspeccionar datos fuera del índice para satisfacer la query.
haga clic para ampliar

Para más información sobre consultas cubiertas, vea Ejecutar consultas cubiertas.

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.

Se aplican ciertas restricciones a los índices, como la longitud de las claves del índice o la cantidad de índices por colección. Consulte Limitaciones de Índices para obtener detalles.

Aunque los índices pueden mejorar el rendimiento de las consultas, también presentan algunas consideraciones operativas. Consulta 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 utilizan Long(1) en lugar de 1 para especificar el orden del índice. Los índices resultantes son los mismos.

Volver

Pipeline de agregación

Obtén una insignia de habilidad

¡Domina los "Fundamentos del diseño de indexación" gratis!

Más información

En esta página