Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ /

Crie índices seletivos para responder às query com eficiência

Nesta página

  • Exemplos

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.

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.

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.

Voltar

Classificar Resultados da Consulta

Nesta página