Un índice admite una consulta cuando contiene todos los campos escaneados por esta. La consulta escanea el índice, no la colección. La creación de índices compatibles con consultas mejora considerablemente el rendimiento de las consultas.
Este documento describe estrategias para crear índices que admitan consultas.
Crear un índice de clave única si todas las consultas utilizan la misma clave única
Si solo consulta una clave en una colección determinada, deberá crear un único índice de clave única para esa colección. Por ejemplo, podría crear un índice en category en la colección product:
db.products.createIndex( { "category": 1 } )
Crear Índices Compuestos para Soportar Varias queries Diferentes
Si a veces consulta solo una clave y otras veces la consulta combinada con otra, crear un índice compuesto es más eficiente que crear un índice de clave única. MongoDB usará el índice compuesto para ambas consultas. Por ejemplo, podría crear un índice tanto para category como para item.
db.products.createIndex( { "category": 1, "item": 1 } )
Esto le permite ambas opciones. Puede consultar solo category y también puede consultar category combinado con item. Un solo El índice compuesto en múltiples campos puede soportar todas las consultas que buscan un subconjunto "prefijo" de esos campos.
Ejemplo
El siguiente índice en una colección:
{ x: 1, y: 1, z: 1 }
Puede admitir consultas admitidas por los siguientes índices:
{ x: 1 } { x: 1, y: 1 }
Hay algunas situaciones en las que los índices de prefijo pueden ofrecer un mejor rendimiento de consulta: por ejemplo, si z es una matriz grande.
El índice { x: 1, y: 1, z: 1 } también puede admitir muchas de las mismas consultas que el siguiente índice:
{ x: 1, z: 1 }
Además, { x: 1, z: 1 } tiene un uso adicional. Dada la siguiente consulta:
db.collection.find( { x: 5 } ).sort( { z: 1} )
El { x: 1, z: 1 } índice admite tanto la consulta como la ordenación, mientras que el { x: 1, y: 1, z: 1 } índice solo admite la consulta. Para obtener más información sobre la ordenación, consulte Usar índices para ordenar los resultados de una consulta.
A partir de la 2.6 versión, MongoDB puede usar la intersección de índices para procesar consultas. La elección entre crear índices compuestos que admitan sus consultas o confiar en la intersección de índices depende de las características específicas de su sistema. Consulte Intersección de índices e Índices compuestos para obtener más información.
Crear índices para brindar soporte a la 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.
Uso e intercalación del índice
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.