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 o conjunto de campos en particular, entonces un índice en el campo consultado o un Un índice compuesto en el conjunto de campos puede impedir que la consulta escanee toda la colección para encontrar y devolver los resultados. Para más información sobre índices, consulte la documentación completa de índices en MongoDB.

Ejemplo

Una aplicación consulta el inventory Colección en el campo type. El valor del campo type depende del usuario.

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

Para mejorar el rendimiento de esta consulta, agregue un índice ascendente o descendente a la inventory colección en el type campo. []1 mongoshEn, puede crear índices utilizando el db.collection.createIndex() método:

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

Este índice puede evitar que la consulta anterior en type escanee toda la colección para devolver los resultados.

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

Además de optimizar las operaciones de lectura, los índices permiten la ordenación y un uso más eficiente del almacenamiento.db.collection.createIndex() Consulte e Índices para obtener más información sobre la creación de índices.

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

La selectividad de las consultas se refiere a la eficacia con la que el predicado de consulta excluye o filtra los documentos de una colección. Esta selectividad puede determinar si las consultas pueden usar índices eficazmente o si, incluso, los usan.

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 consultas menos selectivas coinciden con un mayor porcentaje de documentos. Estas consultas no pueden utilizar los índices eficazmente o incluso no los utilizan en absoluto.

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