Un índice cubre un query cuando el índice contiene todos los campos escaneados por el query. Un query cubierto escanea el índice y no la colección, lo que mejora el rendimiento del query.
Los índices también pueden admitir parcialmente los queries si un subconjunto de los campos consultados está indexado.
Acerca de esta tarea
Una única colección puede tener un máximo de 64 índices. Sin embargo, un exceso de índices puede degradar el rendimiento antes de que se alcance ese límite. Para colecciones con una alta proporción de escritura a lectura, los índices pueden degradar el rendimiento porque cada inserción también debe actualizar los índices.
Pasos
Identifica queries comunes.
Para identificar patrones de consulta comunes en su aplicación, utilice el
$queryStatsetapa de agregación. $queryStats informa métricas para formas de consulta, que agrupan consultas en función de campos compartidos.
Crear índices para brindar soporte a queries comunes
Una vez que sepa qué campos consulta con frecuencia su aplicación, puede crear índices para admitir consultas en esos campos. Para obtener más información, consulte Ejemplos.
Analizar el uso de índices
Una vez que la aplicación comience a usar índices, se puede analizar la efectividad de los índices. Para ver las estadísticas y el uso del índice, se puede:
Utiliza la etapa de agregación
$indexStats.Para implementaciones de MongoDB Atlas, consulta Índices en la interfaz de usuario de MongoDB Atlas.
Considera borrar los índices no utilizados para optimizar el rendimiento de la aplicación. Para obtener más información, consulta Remover índices innecesarios.
Repite este procedimiento periódicamente para asegurarte de que tus índices brinden soporte a su carga de trabajo actual.
Ejemplos
Crea un índice de una sola clave
Si la aplicación solo realiza queries de una única clave en una colección determinada, entonces se necesita crear un índice de clave única para esa colección. Por ejemplo, se puede crear un índice en category en la colección product:
db.products.createIndex( { category: 1 } )
El índice anterior admite este query:
db.products.find( { category: "electronics" } )
Crear un índice compuesto
Si la aplicación realiza queries tanto sobre una clave única como sobre varias claves, un índice compuesto es más eficiente que un índice de clave única. Por ejemplo, se puede crear un índice en los campos category, item y location:
db.products.createIndex( { category: 1, item: 1, location: 1 } )
Prefijos de índices
Un índice compuesto admite queries sobre los prefijos del índice, que son los subconjuntos iniciales de los campos indexados. Por ejemplo, el índice precedente admite estos queries:
db.products.find( { category: "electronics" } ) db.products.find( { category: "electronics", item: "television" } )
Para obtener más información y consideraciones sobre el rendimiento de los prefijos de índice, consulta Prefijos de índice.
Crear índices para brindar soporte a la búsqueda de texto
Para los datos alojados en MongoDB, puedes brindar soporte para la búsqueda de texto completo con índices de búsqueda de MongoDB. Para obtener más información, consulta Crear un índice de búsqueda de MongoDB.
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.
Crear índices de búsqueda vectorial
Los índices de búsqueda vectorial admiten queries sobre incrustaciones vectoriales. Para crear índices de búsqueda vectorial, consulta Campos de índice para la búsqueda vectorial.
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.