Docs Menu
Docs Home
/ /
Strategies

Crear índices para garantizar la selectividad de las consultas

La selectividad es la capacidad de una query para restringir los resultados utilizando índices. Las querys eficaces son más selectivas y permiten a MongoDB utilizar índices para una mayor parte del trabajo asociado con la realización de la query.

Para garantizar la selectividad, cree consultas que limiten el número de documentos posibles con el campo o campos indexados. Cree consultas con la selectividad adecuada en relación con sus datos indexados.

Consideremos una colección de documentos que tienen la siguiente forma:

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

En este ejemplo, el status El 99% de los documentos de la colección processed es. Si añade un índice en status y consulta documentos con el status processedde, el índice tiene baja selectividad con esta consulta. Sin embargo, si desea consultar documentos que no tienen status el processed de, este índice tiene alta selectividad porque la consulta solo lee 1el % del índice.

Considere una colección de documentos donde el campo status tiene tres valores distribuidos en 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 agrega un índice en status y consulta { "status": "pending", "product_type": "electronics" }, MongoDB debe leer tres claves de índice para devolver el resultado coincidente. De forma similar, una consulta 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 consulta { "status": 2, "product_type": "grocery" }, MongoDB solo lee un documento para completar la consulta. El índice y la consulta son más selectivos porque solo hay un documento coincidente y la consulta puede seleccionar ese documento específico mediante el índice.

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 necesitaría leer cuatro documentos. Sin embargo, si se crea un índice compuesto sobre product_type y status, una consulta sobre { "status": { $gt: 5 }, "product_type": "grocery" } solo necesitaría leer dos documentos.

Para mejorar la selectividad, puede crear una Índice compuesto que restringe los documentos que leen las consultas. Por ejemplo, si desea mejorar la selectividad de las consultas en status y,product_type podría crear un índice compuesto en esos dos campos.

Si MongoDB lee una gran cantidad de documentos para obtener resultados, algunas consultas podrían funcionar más rápido sin índices. Para determinar el rendimiento, consulte Medir el uso de índices.

Volver

Ordene los resultados del query

En esta página