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
/ /
Strategies

Cree índices selectivos para responder el query de forma eficiente

La selectividad es una propiedad de consulta que describe la proporción de documentos que coinciden con la consulta respecto al número total de documentos de una colección. La selectividad de un índice describe cuántos documentos coincide con una clave de índice única. Una consulta o índice presenta alta selectividad cuando, proporcionalmente, pocos documentos coinciden con una consulta o una clave de índice determinada.

Dado que los índices pueden tener diferentes selectividades según las claves utilizadas, asegúrese de que los índices más selectivos estén disponibles según los predicados de una consulta. Para garantizar la ejecución más eficiente de la consulta, cree índices que coincidan de forma única con los predicados de la consulta.

Considera una colección de documentos que tiene la siguiente forma:

{
status: "processed",
product_type: "electronics"
}

En este ejemplo, el status de 99% de los documentos en la colección es processed. Si añades un índice en status y consultas documentos con el status de processed, tanto el índice como la query tendrán baja selectividad. Sin embargo, si deseas consultar documentos que no tienen status de processed, el índice y la query tienen una alta selectividad porque la query solo devuelve el 1% de los documentos en una colección.

Considera una colección de documentos donde el campo status tiene tres valores distribuidos en toda la colección:

[
{ _id: ObjectId(), status: "processed", product_type: "electronics" },
{ _id: ObjectId(), status: "processed", product_type: "grocery" },
{ _id: ObjectId(), status: "processed", product_type: "household" },
{ _id: ObjectId(), status: "pending", product_type: "electronics" },
{ _id: ObjectId(), status: "pending", product_type: "grocery" },
{ _id: ObjectId(), status: "pending", product_type: "household" },
{ _id: ObjectId(), status: "new", product_type: "electronics" },
{ _id: ObjectId(), status: "new", product_type: "grocery" },
{ _id: ObjectId(), status: "new", product_type: "household" }
]

Si se añade un índice en status y se hace query para { "status": "pending", "product_type": "electronics" }, MongoDB debe leer tres claves de índice, recuperar tres documentos que coincidan con ese estado y filtrar esos documentos aún más en product_type para devolver el documento coincidente. De igual forma, una query para { "status": {$in: ["processed", "pending"] }, "product_type" : "electronics" } debe leer seis documentos para devolver los dos documentos coincidentes.

Considera el mismo índice en una colección donde status tiene nueve valores distribuidos por la colección:

[
{ _id: ObjectId(), status: 1, product_type: "electronics" },
{ _id: ObjectId(), status: 2, product_type: "grocery" },
{ _id: ObjectId(), status: 3, product_type: "household"},
{ _id: ObjectId(), status: 4, product_type: "electronics" },
{ _id: ObjectId(), status: 5, product_type: "grocery"},
{ _id: ObjectId(), status: 6, product_type: "household"},
{ _id: ObjectId(), status: 7, product_type: "electronics" },
{ _id: ObjectId(), status: 8, product_type: "grocery" },
{ _id: ObjectId(), status: 9, product_type: "household" }
]

Si query por { "status": 2, "product_type": "grocery" }, MongoDB lee solo un documento que coincida con la clave del índice, lo que indica que el índice es altamente selectivo. Al utilizar este índice, puedes recibir una respuesta a una query de manera más eficiente, ya que MongoDB solo debe filtrar aún más un documento que coincida con el valor del índice. En este caso, el filtro también coincide y la query solo devuelve un documento.

Aunque la consulta de este ejemplo sobre la igualdad status es más selectiva, una consulta como { "status": { $gt: 5 }, "product_type": "grocery" } aún necesita leer cuatro documentos si se usa el mismo índice en status. Sin embargo, si se crea un índice compuesto en product_type y status, MongoDB puede responder de forma más eficiente a una consulta para {"status": { $gt: 5 }, "product_type": "grocery" } mediante el índice compuesto, ya que la consulta solo devuelve un documento coincidente.

Para mejorar el rendimiento de las query, puedes crear un índice compuesto que restringe los documentos que las consultas leen. Por ejemplo, si deseas mejorar el rendimiento de las consultas sobre status y product_type, podrías crear un índice compuesto sobre esos dos campos.

Si MongoDB lee una cantidad relativamente grande de documentos para devolver resultados, algunas consultas pueden ejecutarse más rápido sin índices. Para determinar el rendimiento, consulta Medir el uso del índice.

Volver

Ordene los resultados del query

En esta página