Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Conceptos CRUD

Optimización de consultas

Los índices mejoran la eficiencia de las operaciones de lectura al reducir la cantidad de datos que las operaciones de query necesitan procesar. Esto simplifica el trabajo asociado con el cumplimiento de queries dentro de MongoDB.

Si su aplicación consulta una colección sobre un campo específico o conjunto de campos, entonces un índice sobre el campo consultado o un índice compuesto en el conjunto de campos puede evitar que la consulta escanee toda la colección para encontrar y devolver los resultados de la query. Para obtener más información sobre los índices, consulta la documentación completa de índices en MongoDB.

Ejemplo

Una aplicación consulta el inventory colección en el campo de type. El valor del campo type está dirigido por el usuario.

var typeValue = <someUserInput>;
db.inventory.find( { type: typeValue } );

Para mejorar el rendimiento de esta query, añada un índice ascendente o descendente a la colección inventory en el campo type. [1] En mongosh, puedes crear índices usando el método db.collection.createIndex():

db.inventory.createIndex( { type: 1 } )

Este índice puede evitar que la query anterior sobre type recorra toda la colección para devolver los resultados.

Para analizar el rendimiento de la query con un índice, consulta Analizar el rendimiento de la query.

Además de optimizar las operaciones de lectura, los índices pueden ayudar a soportar operaciones de ordenamiento y a un uso más eficiente del almacenamiento. Consulta db.collection.createIndex() y Índices para más información sobre la creación de índices.

[1] Para los índices de un solo campo, la selección entre orden ascendente y descendente es irrelevante. Para los índices compuestos, la selección es importante. Consulta el orden de indexación para más detalles.

La selectividad de la query se refiere a qué tan bien el predicado de la query excluye o filtra documentos en una colección. La selectividad de las consultas puede determinar si las consultas pueden usar índices de manera efectiva o siquiera usar índices en absoluto.

Los queries más selectivos coinciden con un porcentaje menor de documentos. Por ejemplo, una coincidencia exacta en el campo único _id es altamente selectiva, ya que puede coincidir como máximo con un documento.

Las queries menos selectivas coinciden con un mayor porcentaje de documentos. Las queries menos selectivas no pueden aprovechar los índices de forma efectiva ni siquiera utilizarlos.

Por ejemplo, los operadores de desigualdad $nin y $ne no son muy selectivos, ya que a menudo coinciden con una gran parte del índice. Como resultado, en muchos casos, un query $nin o $ne con un índice puede no tener un mejor desempeño que un query $nin o $ne que debe escanear todos los documentos de una colección.

La selectividad de regular expressions depende de las expresiones en sí mismas. Para aprender más, se puede consultar uso de expresiones regulares e índice.

Un query cubierto es un query que se puede satisfacer en su totalidad mediante un índice y no tiene que examinar ningún documento. Un índice cubre un query cuando se aplican todas las siguientes condiciones:

  • Todos los campos del query (tanto los especificados por la aplicación como los necesarios internamente, como para fines de partición) son parte de un índice.

  • Todos los campos devueltos en los resultados están en el mismo índice.

  • Ningún campo en el query es igual a null. Por ejemplo, los siguientes predicados de queries no pueden dar lugar a queries cubiertos:

    • { "field": null }

    • { "field": { $eq: null } }

Una colección de inventory tiene el siguiente índice en los campos type y item:

db.inventory.createIndex( { type: 1, item: 1 } )

El índice cubre la siguiente operación que hace queries en los campos type y item y devuelve solo el campo item:

db.inventory.find(
{ type: "food", item:/^c/ },
{ item: 1, _id: 0 }
)

Para que el índice especificado cubra el query, el documento de proyección debe especificar explícitamente _id: 0 para excluir el campo _id del resultado, ya que el índice no incluye el campo _id.

Un índice puede cubrir un query sobre campos dentro de documentos incrustados.

Por ejemplo, considere una colección userdata con documentos de la siguiente forma:

db.userdata.insertOne(
{ _id: 1, user: { login: "tester" } }
)

La colección tiene el siguiente índice:

db.userdata.createIndex(
{ "user.login": 1 }
)

El índice { "user.login": 1 } cubre el siguiente query:

db.userdata.find(
{ "user.login": "tester" },
{ "user.login": 1, _id: 0 }
)

Nota

Para indexar campos en documentos incrustados, se debe utilizar notación de puntos. Consultar Crear un Índice en un campo incrustado.

Los índices multiclave pueden cubrir queries sobre campos que no son arreglos si el índice rastrea qué campo o campos hacen que el índice sea multiclave.

Índices multiclave no pueden cubrir consultas sobre campos de arreglos.

Para ver un ejemplo de un query cubierto con un índice multiclave, se puede consultar Queries cubiertos en la página de índices multiclave.

Debido a que el índice contiene todos los campos requeridos por el query, MongoDB puede hacer coincidir las condiciones del query y devolver los resultados utilizando solo el índice.

Consultar únicamente el índice puede ser mucho más rápido que consultar documentos fuera del índice. Las claves de índice suelen ser más pequeñas que los documentos que catalogan, y los índices suelen estar disponibles en la RAM o ubicados secuencialmente en el disco.

No todos los tipos de índice pueden cubrir queries. Para obtener detalles sobre el soporte de índices cubiertos, se puede consultar la página de documentación del tipo de índice correspondiente.

Cuando se ejecuta en mongos, los índices solo pueden cubrir queries en las colecciones particionadas si el índice contiene la clave de partición.

Para determinar si un query es un query cubierto, se debe utilizar el método db.collection.explain() o el método explain(). Ver Queries cubiertos.

Volver

Coherencia causal

En esta página