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 del 99% de los documentos en la colección es processed. Si agregas un índice en status y consultas documentos con el status de processed, tanto el índice como la query tienen baja selectividad. Sin embargo, si deseas realizar una query para documentos que no tengan el 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 consultas, puedes crear un índice compuesto que limite los documentos que las consultas leen. Por ejemplo, si quieres mejorar el rendimiento de las consultas en status y product_type, podrías crear un índice compuesto en 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.