Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Criar índices para garantir a seletividade da consulta

Nesta página

  • Exemplos

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.

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.

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.

← Verifique se os índices cabem na RAM

Nesta página