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 los patrones de query comunes en tu aplicación, utiliza
$queryStats etapa de agregación. $queryStats informa métricas para formas del query, que agrupan las consultas según los campos compartidos.
Crear índices para brindar soporte a queries comunes
Después de averiguar en qué campos tu aplicación hace query con frecuencia, puedes crear índices para facilitar las queries en esos campos. Para más información, consulte ejemplo.
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
Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Nota
Los document en la colección movies contienen campos adicionales que no se muestran aquí.
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 title en la colección movies:
db.movies.createIndex( { title: 1 } )
Este índice admite esta query:
db.movies.find( { title: 'Mulholland Drive' } )
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 year, runtime y title:
db.movies.createIndex( { year: 1, runtime: 1, title: 1 } )
Prefijos de índices
Un índice compuesto soporta consultas en prefijos de índice, que son los subconjuntos iniciales de los campos indexados. Por ejemplo, el índice anterior admite esta query:
db.movies.find( { year: 2012, runtime: { $gt: Decimal128( "120" ) } }, { title: 1 } )
Para obtener más información y consideraciones sobre el rendimiento de los prefijos de índice, consulta Prefijos de índice.
Crear índices para admitir consultas $text
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 usar un índice para comparaciones de string, una operación debe especificar también la misma intercalación. Si una operación especifica una intercalación diferente a la que especifica el índice, el índice no puede admitir comparaciones de string en los campos indexados.
Advertencia
Las claves de índice sensibles a la intercalación pueden ser más grandes que las claves de índice que no la utilizan, ya que los índices configurados con intercalación utilizan claves de intercalación ICU para lograr un orden de clasificación.
Utiliza el siguiente código para crear un índice en la colección movies de la base de datos sample_mflix con la configuración regional de intercalación "fr" para comparaciones de string:
db.movies.createIndex( { title: 1 }, { collation: { locale: "fr" } } )
La siguiente query, que especifica la misma intercalación que el índice, puede utilizar el índice:
db.movies.find( { title: "Les Misèrables" }, { title: 1, year: 1 } ).collation( { locale: "fr" } )
Sin embargo, la siguiente operación de query, que por defecto utiliza el comparador binary "simple", no puede utilizar el índice y requiere un COLLSCAN.
db.movies.find( { title: "Les Misèrables" }, { title: 1 , year: 1 } )
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, puedes utilizar el siguiente código para crear un índice compuesto en la colección movies de la base de datos sample_mflix, especificando los campos numéricos year y metacritic y el campo string title. El índice también especifica la intercalación "fr" para las comparaciones de string:
db.movies.createIndex( { year: 1, metacritic: 1, title: 1 }, { collation: { locale: "fr" } } )
Las siguientes operaciones, que utilizan la intercalación binaria "simple" para las comparaciones de strings, pueden usar el índice:
db.movies.find( { year: 2012 }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
db.movies.find( { year: 2012, metacritic: { $gt: Decimal128( "50" ) } }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
La siguiente operación, que utiliza la intercalación binaria "simple" para las comparaciones de string en el campo title indexado, puede usar el índice para cumplir solo con la parte year: 2012 de la query:
db.movies.find( { year: 2012, title: "Les Misèrables" }, { year: 1, title: 1 } )
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.