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 como 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 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:

Diagrama de una consulta que utiliza un índice para seleccionar y devolver resultados ordenados. El índice almacena los valores de puntuación 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 _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.


➤ 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:

1
  1. En el panel de navegación izquierdo de MongoDB Compass, haga 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, ingrese el nombre del índice que desea crear o déjelo en blanco para que MongoDB cree un nombre predeterminado para el índice.

4

Para especificar una clave para el índice, seleccione el campo y el tipo de índice. Para indexar campos adicionales, haga 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 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 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á marcada, 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 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.

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.

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

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.

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.

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.

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.

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``.

Consulte Índices multiclave y Límites de índices multiclave para obtener más información sobre los índices multiclave.

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.

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.

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 agrupado. Las colecciones creadas con un índice de clústeres se denominan colecciones con índice clusterizado.

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 campos específicos

  • Múltiples campos específicos en un documento

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

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.

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.

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.

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.

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.

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.

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:

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.

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

Para obtener más información sobre las consultas cubiertas, consulte 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 o el número de índices por colección. Consulte Limitaciones de índices para obtener más información.

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.

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