Crie índices seletivos para responder às query com eficiência
Nesta página
Seletividade é uma propriedade de query que descreve a proporção de documentos correspondentes à query versus o número total de documentos em uma collection. A seletividade de um índice descreve a quantos documentos uma chave de índice único corresponde. Uma query ou índice tem alta seletividade quando proporcionalmente poucos documentos correspondem a uma query ou a uma determinada chave de índice.
Como os índices podem ter seletividades diferentes, dependendo das chaves de índice usadas, certifique-se de que os índices mais seletivos estejam disponíveis com base nos predicados contidos em uma query. Para garantir a execução de query mais eficiente, crie índices que correspondam de forma mais exclusiva aos predicados contidos em uma query.
Exemplos
Seletividade com muitos valores comuns
Considere uma coleção de documentos que possuem o seguinte formato:
{ status: "processed", product_type: "electronics" }
Neste exemplo, o status
de 99% dos documentos na coleção é processed
. Se você adicionar um índice em status
e fazer uma query de documentos com o status
de processed
, tanto o índice quanto a query terão baixa seletividade. No entanto, se você quiser fazer query de documentos que não tenham o status
de processed
, o índice e a query terão alta seletividade, pois a query retorna apenas 1% dos documentos em uma collection.
Seletividade quando valores são distribuídos
Considere uma coleção de documentos em que o campo status
tem três valores distribuídos pela coleção:
[ { _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" } ]
Se você adicionar um índice em status
e executar uma query de { "status": "pending",
"product_type": "electronics" }
, o MongoDB deverá ler três chaves de índice, recuperar três documentos correspondentes a esse status e filtrar esses documentos ainda mais em product_type
para retornar o único documento correspondente. Da mesma forma, uma query para { "status": {$in: ["processed", "pending"] }, "product_type" : "electronics" }
deve ler seis documentos para retornar os dois documentos correspondentes.
Considere o mesmo índice em uma coleção em que status
tem nove valores distribuídos pela coleção:
[ { _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" } ]
Se você fizer query do { "status": 2, "product_type": "grocery" }
, o MongoDB lê somente um documento que corresponde à chave do índice, indicando que o índice é altamente seletivo. Ao usar esse índice, você pode receber uma resposta de query com mais eficiência, pois o MongoDB só deve filtrar ainda mais um documento que corresponda ao valor do índice. Nesse caso, o filtro também corresponde e a query retorna apenas um documento.
Embora a query deste exemplo sobre status
igualdade seja mais seletiva, uma query como { "status": { $gt: 5 }, "product_type": "grocery" }
ainda precisa ler quatro documentos se você usar o mesmo índice em status
. No entanto, se você criar um índice composto em product_type
e status
, o MongoDB poderá responder com mais eficiência a uma query de {"status": { $gt: 5 }, "product_type": "grocery" }
por meio do índice composto, pois a query retorna apenas um documento correspondente.
Para melhorar o desempenho da query, você pode criar um índice composto que restringe os documentos que as query leem. Por exemplo, se você quiser melhorar o desempenho das queries em status
e product_type
, poderá criar um índice composto nesses dois campos.
Se o MongoDB ler um número relativamente grande de documentos para retornar resultados, algumas queries poderão ser executadas mais rapidamente sem índices. Para determinar o desempenho, consulte Medir o uso do índice.