Criar índices para garantir a seletividade da consulta
Nesta página
Seletividade é a capacidade de uma query restringir os resultados usando índices. As queries eficazes são mais seletivas e permitem que o MongoDB use índices para uma parte maior do trabalho associado ao preenchimento da query.
Para garantir a seletividade, escreva consultas que limitem o número de documentos possíveis com o campo ou campos indexados. Escreva consultas que sejam apropriadamente seletivas em relação aos seus dados indexados.
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
, o índice terá baixa seletividade com essa query. No entanto, se você quiser fazer query de documentos que não tenham o status
de processed
, esse índice terá alta seletividade porque a query lê apenas 1% do índice.
Seletividade com valores 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 no status
e consultar { "status": "pending",
"product_type": "electronics" }
, o MongoDB deverá ler três chaves de índice para retornar o resultado correspondente. Da mesma forma, a consulta de { "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ê consultar { "status": 2, "product_type": "grocery" }
, o MongoDB lerá apenas um documento para atender à consulta. O índice e a query são mais seletivos porque há somente um documento correspondente e a query pode selecionar esse documento específico usando o índice.
Embora a consulta deste exemplo sobre igualdade de status
seja mais seletiva, uma consulta como { "status": { $gt: 5 }, "product_type": "grocery" }
ainda precisaria ler quatro documentos. No entanto, se você criar um índice composto em product_type
e status
, a consulta de {
"status": { $gt: 5 }, "product_type": "grocery" }
só precisará ler dois documentos.
Para melhorar a seletividade, você pode criar umíndice composto que restringe os documentos que as query leem. Por exemplo, se você quiser melhorar a seletividade das queries em status
e product_type
, poderá criar um índice composto nesses dois campos.
Se o MongoDB ler um grande número de documentos para retornar resultados, algumas consultas poderão ter um desempenho mais rápido sem índices. Para determinar o desempenho, consulte Medir o uso do índice.