Los índices admiten la ejecución eficiente de consultas en MongoDB. Sin índices, MongoDB debe realizar un escaneo de colección , es decir, escanear cada documento en una colección, para seleccionar aquellos documentos que coincidan con la declaración de consulta. Si existe un índice apropiado para una consulta, MongoDB puede usar el índice para limitar la cantidad de documentos que debe inspeccionar.
Los índices son estructuras de datos especiales [ 1 ] que almacenan una pequeña parte del conjunto de datos de la colección en una forma fácil de recorrer. El índice almacena el valor de un campo específico o un conjunto de campos, ordenados por el valor del campo. El orden de las entradas de índice admite coincidencias de igualdad eficientes y operaciones de consulta basadas en rangos. Además, MongoDB puede devolver resultados ordenados utilizando el orden en el índice.
El siguiente diagrama ilustra una consulta que selecciona y ordena los documentos coincidentes mediante un índice:
Básicamente, los índices en MongoDB son similares a los índices en 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.
MongoDB crea un índice único en el campo _id durante la creación de una colección. El _id
índice evita que los clientes inserten dos documentos con el mismo valor para el _id
campo. No puede colocar este índice en el _id
campo.
NOTA: En clústeres fragmentados , si no usa el _id
campo como clave de fragmento , su aplicación debe garantizar la unicidad de los valores en el _id
campo para evitar errores. Esto se hace con mayor frecuencia mediante el uso de un ObjectId estándar generado automáticamente .
➤ Utilice el menú desplegable Seleccione su idioma en la parte superior derecha para establecer el idioma de los ejemplos en esta página.
Para crear un índice en Mongo Shell , use db.collection.createIndex()
.
db.collection.createIndex( <key and index type specification>, <options> )
El siguiente ejemplo crea un índice descendente de clave única en el name
campo:
db.collection.createIndex( { name: -1 } )
El db.collection.createIndex()
método solo crea un índice si aún no existe un índice de la misma especificación.
[ 1 ] | Los índices de MongoDB utilizan una estructura de datos de árbol B. |
---|
El nombre predeterminado para 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, como uno que sea más legible por humanos que el predeterminado. Por ejemplo, considere una aplicación que consulta con frecuencia la products
colección para completar datos en el inventario existente. El siguiente createIndex()
método crea un índice item
y se quantity
nombra query for inventory
:
db.products.createIndex(
{ item: 1, quantity: -1 } ,
{ name: "query for inventory" }
)
Puede ver los nombres de los índices utilizando el db.collection.getIndexes()
método. No puede cambiar el nombre de un índice una vez creado. En su lugar, debe eliminar y volver a crear el índice con un nombre nuevo.
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 .
Para un índice de un solo campo y operaciones de clasificación, el orden de clasificación (es decir, ascendente o descendente) de la clave de índice no importa porque MongoDB puede atravesar 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 índices de campo único.
MongoDB también admite índices definidos por el usuario en varios campos, es decir , índices compuestos .
El orden de los campos enumerados 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 userid
valor, ordena por score
.
Para índices compuestos y operaciones de clasificación, el orden de clasificación (es decir, ascendente o descendente) de las claves de índice puede determinar si el índice puede admitir una operación de clasificación. Consulte Orden de clasificación para obtener más información sobre el impacto del orden de índice en los resultados de los índices compuestos.
Consulte Índices compuestos y Ordenar en varios campos para obtener más información sobre índices compuestos.
MongoDB utiliza índices de varias claves 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 de la matriz. Estos índices de varias claves permiten que las consultas seleccionen documentos que contienen matrices haciendo coincidir el elemento o elementos de las matrices. MongoDB determina automáticamente si se debe crear un índice de varias claves si el campo indexado contiene un valor de matriz; no es necesario especificar explícitamente el tipo de múltiples claves.
Consulte Índices de múltiples claves y Límites de índices de múltiples claves para obtener más información sobre los índices de múltiples claves.
Para admitir consultas eficientes de datos de coordenadas geoespaciales, MongoDB proporciona dos índices especiales: índices 2d que usan geometría plana al devolver resultados e índices 2dsphere que usan geometría esférica para devolver resultados.
Consulte 2d
Index Internals para obtener una introducción de alto nivel a los índices geoespaciales.
MongoDB proporciona un text
tipo de índice que admite la búsqueda de contenido de cadena en una colección. Estos índices de texto no almacenan palabras vacías específicas del idioma (por ejemplo, "el", "a", "o") y derivan las palabras en una colección para almacenar solo palabras raíz.
Consulte Índices de texto para obtener más información sobre los índices de texto y la búsqueda.
Para admitir la fragmentación basada en hash , MongoDB proporciona un tipo de índice hash , que indexa el hash del valor de un campo. Estos índices tienen una distribución de valores más aleatoria a lo largo de su rango, pero solo admiten coincidencias de igualdad y no pueden admitir consultas basadas en rangos.
La propiedad única de un índice hace que MongoDB rechace valores duplicados para el campo indexado. Aparte de la restricción única, los índices únicos son funcionalmente intercambiables con otros índices de MongoDB.
Nuevo en la versión 3.2 .
Los índices parciales solo indexan los documentos de una colección que cumplen una expresión de filtro especificada. Al indexar un subconjunto de los documentos de una colección, los índices parciales tienen menores requisitos de almacenamiento y menores costos de rendimiento para la creación y el mantenimiento de índices.
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 asegura que el índice solo contenga entradas para documentos que tienen el campo indexado. El índice omite los documentos que no tienen el campo indexado.
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 los documentos de indexación que carecen 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 cierto período de tiempo. Esto es ideal para ciertos tipos de información, como datos de eventos generados por máquinas, registros e información de sesiones que solo necesitan persistir en una base de datos durante un período de tiempo finito.
Consulte: Caducar datos de 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 consultas y no se pueden utilizar para admitir una consulta.
Al ocultar un índice al planificador, los usuarios pueden evaluar el impacto potencial de eliminar un índice sin eliminarlo realmente. Si el impacto es negativo, el usuario puede mostrar el índice en lugar de tener que volver a crear un índice eliminado. Y debido a que los índices se mantienen completamente mientras están ocultos, los índices están inmediatamente disponibles para su uso una vez que se muestran.
A excepción del _id
índice, puede ocultar cualquier índice.
Los índices pueden mejorar la eficiencia de las operaciones de lectura. El tutorial Analizar el rendimiento de las consultas proporciona 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 para usar, consulte el optimizador de consultas .
Nuevo en la versión 3.4 .
La intercalación permite a los usuarios especificar reglas específicas del idioma para la comparación de cadenas, como reglas para letras y tildes.
➤ Utilice el menú desplegable Seleccione su idioma en la parte superior derecha para establecer el idioma de los ejemplos en esta página.
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 admitir una operación que realiza comparaciones de cadenas en los campos indexados si la operación especifica una intercalación diferente.
Por ejemplo, la colección myColl
tiene un índice en un campo de cadena category
con la configuración regional de clasificación "fr"
.
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
La siguiente operación de consulta, que especifica la misma intercalación que el índice, puede usar el índice:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
Sin embargo, la siguiente operación de consulta, que de forma predeterminada utiliza el intercalador binario "simple", no puede utilizar el índice:
db.myColl.find( { category: "cafe" } )
Para un índice compuesto donde las claves de prefijo de índice no son cadenas, matrices ni documentos incrustados, una operación que especifica una intercalación diferente aún puede usar el índice para admitir comparaciones en las claves de prefijo de índice.
Por ejemplo, la colección myColl
tiene un índice compuesto sobre los campos numéricos score
y price
y el campo de cadena category
; el índice se crea con la configuración regional de intercalación "fr"
para las comparaciones de cadenas:
db.myColl.createIndex(
{ score: 1, price: 1, category: 1 },
{ collation: { locale: "fr" } } )
Las siguientes operaciones, que utilizan la "simple"
intercalación binaria para las comparaciones de cadenas, pueden utilizar el índice:
db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
La siguiente operación, que usa la "simple"
intercalación binaria para las comparaciones de cadenas en el category
campo indexado , puede usar el índice para completar solo la score: 5
parte de la consulta:
db.myColl.find( { score: 5, category: "cafe" } )
Para obtener más información sobre la intercalación, consulte la página de referencia de la intercalación .
Los siguientes índices solo admiten la comparación binaria simple y no admiten la intercalación :
- índices de texto ,
- Índices 2d , y
- índices geoHaystack .
Cuando los criterios de consulta y la proyección de una consulta incluyen solo los campos indexados, MongoDB devuelve los resultados directamente del índice sin escanear ningún documento ni traer documentos a la memoria. Estas consultas cubiertas pueden ser muy eficientes.
Para obtener más información sobre consultas cubiertas, consulte Consulta cubierta .
MongoDB puede usar la intersección de índices para completar consultas. Para consultas que especifican condiciones de consulta compuestas, si un índice puede cumplir una parte de una condición de consulta y otro índice puede cumplir otra parte de la condición de consulta, entonces MongoDB puede usar la intersección de los dos índices para cumplir con la consulta. Si el uso de un índice compuesto o el uso de una intersección de índices es más eficiente depende de la consulta en particular 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 de índice o el número de índices por colección. Consulte Limitaciones del índice para obtener más detalles.
Aunque los índices pueden mejorar el rendimiento de las consultas, los índices también presentan algunas consideraciones operativas. Consulte Consideraciones operativas para índices para obtener más información.
Las aplicaciones pueden encontrar un rendimiento reducido durante la creación de índices, incluido el acceso limitado de lectura / escritura a la colección. Para obtener más información sobre el proceso de generación de índices, consulte Generaciones de índices en colecciones pobladas , incluida la sección Generaciones de índices en entornos replicados .
Algunos controladores pueden especificar índices, utilizando en NumberLong(1)
lugar de 1
como especificación. Esto no tiene ningún efecto sobre el índice resultante.