Página inicial do Docs → Desenvolver aplicações → Manual do MongoDB
Crie índices para garantir a seletividade da query
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 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.
Exemplos
Seletividade com muitos valores comuns
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.
Seletividade com valores distribuídos
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.