Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Crie índices para garantir a seletividade da query

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 query que limitem o número de documento possíveis com o campo ou campo indexados. Escreva query que sejam adequadamente seletivas em relação aos seus dados indexados.

Considere uma collection de documento com o seguinte formato:

{
status: "processed",
product_type: "electronics"
}

Neste exemplo, o status de 99% dos documento na collection é processed. Se você adicionar um índice em status e fazer uma query de documento com o status de processed, o índice terá baixa seletividade com essa query. No entanto, se você quiser fazer query de documento que não tenham o status de processed, esse índice terá alta seletividade porque a query lê apenas 1% do índice.

Considere uma collection de documentos onde o campo status tem três valores distribuídos pela collection:

[
{ _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 consultar { "status": "pending", "product_type": "electronics" }, o MongoDB deverá ler três chaves de índice para retornar o único resultado 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 collection em que status tem nove valores distribuídos na collection:

[
{ _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 para { "status": 2, "product_type": "grocery" }, o MongoDB lê apenas um documento para atender à query. O índice e a query são mais seletivos porque há apenas um documento correspondente e a query pode selecionar esse documento específico usando o índice.

Embora a query deste exemplo sobre igualdade seja mais seletiva, uma query como status { "status": { $gt: 5 }, "product_type": "grocery" } ainda precisaria ler quatro documentos. No entanto, se você criar um índice composto em product_type e status, uma query para { "status": { $gt: 5 }, "product_type": "grocery" } só precisaria ler dois documentos.

Para melhorar a seletividade, você pode criar um índice composto que restrinja os documento que as query leem. Por exemplo, se você quiser melhorar a seletividade das query em status e product_type, poderá criar um índice composto nesses dois campo.

Se o MongoDB ler um grande número de documento para retornar resultados, algumas query poderão ser executadas mais rapidamente sem índices. Para determinar o desempenho, consulte Medir o uso do índice.

← Verifique se os índices cabem na RAM

Nesta página