La selectividad es una propiedad de las queries que describe la proporción de documentos que coinciden con la query frente al número total de documentos en una colección. La selectividad de un índice describe cuántos documentos hace coincidir una clave de índice única. Una query o un índice tienen alta selectividad cuando proporcionalmente pocos documentos coinciden con una query o una clave de índice dada.
Dado que los índices pueden tener diferentes selectividades dependiendo de las claves de índice utilizadas, asegúrate de que los índices más selectivos estén disponibles en función de los predicados contenidos en una query. Para garantizar la ejecución más eficiente de queries, cree índices que coincidan de la manera más única posible con los predicados contenidos en una query.
Ejemplos
Selectividad con muchos valores comunes
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.
Selectividad cuando los valores están distribuidos
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 query de este ejemplo sobre status igualdad es más selectiva, una query como { "status": { $gt: 5 }, "product_type": "grocery" } sigue necesitando leer cuatro documentos si usas el mismo índice en status. Sin embargo, si se crea un índice compuesto en product_type y status, MongoDB puede responder de manera más eficiente a una query de {"status": { $gt: 5 }, "product_type": "grocery" } mediante el índice compuesto, ya que la query devuelve solo 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.