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

Interseção de índice

Nesta página

  • Interseção de prefixo de índice
  • Interseção de índices e índices compostos
  • Interseção e Classificação do Índice
  • Interseção de índice e índices de pesquisa do Atlas

Importante

Esta página documenta casos em que ootimizador de query pode ser capaz de usar a interseção do índice.

Na prática, o otimizador de query raramente seleciona planos que usam a interseção de índices.

A interseção de índices baseada em hash é desabilitada por padrão e a interseção de índices baseada em classificação é desfavorecida na seleção de planos. O otimizador se comporta dessa maneira para evitar a seleção de um plano ruim.

Schema designs should not rely on index intersection. Em vez disso, índices compostos devem ser usados.

Melhorias futuras no otimizador de query podem permitir que o sistema identifique melhor os casos em que um plano de interseção de índice seria benéfico.

O MongoDB pode usar a interseção de vários índices para atender a query. Em geral, cada interseção de índice envolve dois índices; no entanto, o MongoDB pode empregar interseções de índices múltiplos/aninhados para resolver uma query.

Para ilustrar a interseção de índices, considere uma collection orders que tenha os seguintes índices:

{ qty: 1 }
{ item: 1 }

O MongoDB pode usar a interseção dos dois índices para suportar a seguinte query:

db.orders.find( { item: "abc123", qty: { $gt: 15 } } )

Para determinar se o MongoDB usou a interseção de índice, execute explain(); os resultados de explain() incluirão um estágio AND_SORTED ou um estágio AND_HASH .

Com a interseção do índice, o MongoDB pode usar uma interseção de todo o índice ou do prefixo do índice. Um prefixo de índice é um subconjunto de um índice composto, que consiste em uma ou mais chaves a partir do início do índice.

Considere uma collection orders com os seguintes índices:

{ qty: 1 }
{ status: 1, ord_date: -1 }

Para atender à seguinte query que especifica uma condição no campo qty e no campo status , o MongoDB pode usar a interseção dos dois índices:

db.orders.find( { qty: { $gt: 10 } , status: "A" } )

A interseção de índices não elimina a necessidade de criar índices compostos. No entanto, como tanto a ordem da lista (ou seja, a ordem em que as chaves são listadas no índice) quanto a ordem de classificação (ou seja, ascendente ou descendente), importação de índices compostos, um índice composto pode não suportar uma condição de query que não inclua as chaves de prefixo de índice ou que especifique uma ordem de classificação diferente.

Observação

Para implementações hospedadas no MongoDB Atlas, considere utilizaríndices do Atlas Search do para evitar limitações devido à ordem dos campos.

Por exemplo, se uma collection orders tiver o seguinte índice composto, com o campo status listado antes do campo ord_date :

{ status: 1, ord_date: -1 }

O índice composto pode suportar as seguintes query:

db.orders.find( { status: { $in: ["A", "P" ] } } )
db.orders.find(
{
ord_date: { $gt: new Date("2014-02-01") },
status: {$in:[ "P", "A" ] }
}
)

Mas não as duas queries a seguir:

db.orders.find( { ord_date: { $gt: new Date("2014-02-01") } } )
db.orders.find( { } ).sort( { ord_date: 1 } )

No entanto, se a coleta tiver dois índices separados:

{ status: 1 }
{ ord_date: -1 }

Os dois índices podem, individualmente ou por meio de interseção de índices, suportar todas as quatro query mencionadas acima.

A escolha entre criar índice composto que suportem suas query ou confiar na interseção de índices depende das especificidades do seu sistema.

Dica

Veja também:

A interseção de índices não se aplica quando a operação sort() exige um índice completamente separado do predicado da query.

Por exemplo, a collection orders tem os seguintes índices:

{ qty: 1 }
{ status: 1, ord_date: -1 }
{ status: 1 }
{ ord_date: -1 }

O MongoDB não pode usar a interseção de índices para a seguinte query com classificação:

db.orders.find( { qty: { $gt: 10 } } ).sort( { status: 1 } )

Ou seja, o MongoDB não usa o índice { qty: 1 } para a query e o índice separado { status: 1 } ou { status: 1, ord_date: -1 } para a classificação.

No entanto, o MongoDB pode usar a interseção de índice para a seguinte query com classificação, pois o índice { status: 1, ord_date: -1 } pode atender parte do predicado da query.

db.orders.find( { qty: { $gt: 10 } , status: "A" } ).sort( { ord_date: -1 } )

Se você usar o MongoDB Atlas, poderá criar um índice do Atlas Search para atender às queries quando o otimizador de query selecionar um plano que envolva interseção de índices. Ao contrário dos índices compostos, os campos nos índices do Atlas Search podem ser definidos em qualquer ordem. Como resultado, o índice do Atlas Seach pode suportar queries que:

  • Especifique uma ordem de classificação diferente da ordenação indexada.

  • Contêm campos que não fazem parte do prefixo do índice.

Para obter um tutorial sobre como usar índices do Atlas Search quando a interseção do índice é necessária, consulte Consulta flexível com o Atlas Search.

Observação

O índice de pesquisa do Atlas Search está disponível somente para cluster do Atlas do MongoDB Atlas, e não está disponível para deployments managed. Para saber mais, consulte:

Voltar

Criar em clusters fragmentados