Interseção de índice
Nesta página
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
.
Interseção de prefixo de índice
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" } )
Interseção de índices e índices compostos
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.
Interseção e Classificação do Índice
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 } )
Interseção de índice e índices de pesquisa do Atlas
Se você usar o MongoDB Atlas, poderá criar um índice do Atlas Search para atender a 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 utilizar í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: