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.
Ejemplos
Selectividad con muchos valores comunes
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 agrega un índice en status y busca documentos con el status processedde, tanto el índice como la consulta tienen baja selectividad. Sin embargo, si desea buscar documentos que no tengan status el processed de, el índice y la consulta tienen alta selectividad, ya que la consulta solo devuelve el 1% de los documentos de una colección.
Selectividad cuando los valores están distribuidos
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, recuperar tres documentos que coincidan con ese estado y filtrarlos posteriormente en product_type para devolver el documento coincidente. De forma similar, una consulta en { "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 que coincida con la clave del índice, lo que indica que el índice es altamente selectivo. Al usar este índice, puede recibir una respuesta de consulta de forma más eficiente, ya que MongoDB solo debe filtrar un documento que coincida con el valor del índice. En este caso, el filtro también coincide y la consulta 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 consultas, puede crear una Índice compuesto que restringe los documentos que leen las consultas. Por ejemplo, si desea mejorar el rendimiento de las consultas en status y,product_type podría crear un índice compuesto en esos dos campos.
Si MongoDB lee una cantidad relativamente grande 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.