Índices compostos
Nesta página
O MongoDB suporta índices compostos, onde uma única estrutura de índice contém referências a vários campos [1] dentro dos documentos de uma coleção. O diagrama a seguir ilustra um exemplo de um índice composto em dois campos:
[1] | O MongoDB impõe um limite de 32 campos para qualquer índice composto. |
O índice composto pode suportar query que correspondem em vários campo.
Compatibilidade
Você pode utilizar índices compostos para implantações hospedadas no MongoDB Atlas.
Para saber mais sobre como gerenciar índices para distribuições hospedadas no MongoDB Atlas, consulte Criar, visualizar, descartar e ocultar índices.
Criar um índice composto
Para criar um índice composto, use uma operação semelhante ao protótipo a seguir:
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
A ordem dos campos indexados tem um forte impacto na eficácia de um índice específico para uma determinada query. Para a maioria dos índices compostos, seguir a regra ESR (Equality, Sort, Range) ajuda a criar índices eficientes.
Importante
Começando no MongoDB 4.4:
Os índices compostos podem conter um único campo de índice com hash.
Você receberá um erro se tentar criar um índice composto que contenha mais de um campo de índice hashed.
No MongoDB 4.2 ou anterior:
Os índices compostos não podem conter um campo de índice hashed.
Você receberá um erro se tentar criar um índice composto que contenha um campo de índice hashed.
Considere uma coleção chamada products
que contenha documentos semelhantes ao seguinte documento:
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" }
A seguinte operação cria um índice ascendente nos campos item
e stock
:
db.products.createIndex( { "item": 1, "stock": 1 } )
A ordem dos campos listados em um índice composto é importante. O índice conterá referências a documentos classificados primeiro pelos valores do campo item
e, dentro de cada valor do campo item
, classificados pelos valores do campo ações. Consulte Ordem de classificação para obter mais informações.
Além de oferecer suporte a query que correspondem a todos os campo de índice, o índice composto podem oferecer suporte a query que correspondem ao prefixo dos campo de índice. Ou seja, o índice suporta query no campo item
, bem como nos campo item
e stock
:
db.products.find( { item: "Banana" } ) db.products.find( { item: "Banana", stock: { $gt: 5 } } )
Para obter detalhes, consulte Prefixos.
Ordem de classificação
Os índices armazenam referências a campos em ordem de classificação crescente (1
) ou decrescente (-1
). Para índices de campo único, a ordem de classificação das chaves não importa porque o MongoDB pode percorrer o índice em qualquer direção. No entanto, para índices compostos, a ordem de classificação pode ser importante para determinar se o índice pode suportar uma operação de classificação.
Considere uma collection events
que contenha documento com o campo username
e date
. A aplicação pode emitir query que retornam resultados classificados primeiro por username
valores crescentes e, em seguida, por valores decrescentes (ou seja, do mais recente para odate
último), como:
db.events.find().sort( { username: 1, date: -1 } )
ou query que retornam resultados classificados primeiro por valores username
decrescentes e, em seguida, por valores date
crescentes, como:
db.events.find().sort( { username: -1, date: 1 } )
O índice a seguir pode oferecer suporte a ambas as operações de classificação:
db.events.createIndex( { "username" : 1, "date" : -1 } )
No entanto, o índice acima não pode suportar uma classificação por valores username
crescentes e, em seguida, por valores date
crescentes, como o seguinte:
db.events.find().sort( { username: 1, date: 1 } )
Para obter mais informações sobre ordem de classificação e índices compostos, consulte Usar índices para classificar resultados de query.
Prefixos
Os prefixos de índices são os subconjuntos iniciais de campos indexados. Por exemplo, considere o seguinte índice composto:
{ "item": 1, "location": 1, "stock": 1 }
O índice tem os seguintes prefixos de índice:
{ item: 1 }
{ item: 1, location: 1 }
Para um índice composto, o MongoDB pode usar o índice para oferecer suporte a query sobre os prefixos do índice. Dessa forma, o MongoDB pode usar o índice para query nos seguintes campo:
o campo
item
,o campo
item
e o campolocation
,o campo
item
e o campolocation
e o campostock
.
O MongoDB também pode usar o índice para suportar uma query nos campos item
e stock
, já que o campo item
corresponde a um prefixo. No entanto, nesse caso, o índice não seria tão eficiente no suporte à query quanto seria se o índice estivesse apenas em item
e stock
.
Como uma query em item
e stock
omite o prefixo de índice location
, ela não pode usar o campo de índice stock
que segue location
. Somente o campo item
no índice pode suportar essa query. Consulte Criar índices para oferecer suporte a sua query para obter mais informações. O índice:
Corresponde às chaves para
item
.Executa um filtro dentro do estágio
IXSCAN
no campostock
.Retorna o resultado filtrado.
Por exemplo, considere uma query para "item":
"saccharomyces cerevisiae"
e "stock": 60
. Se a collection contiver 10.000 documentos correspondentes a "item":
"saccharomyces cerevisiae"
e apenas 100 desses documentos correspondentes a "stock": 60
, a query examinará 10.000 chaves. No estágio IXSCAN
, a query filtra essas chaves pelo campo stock
e retorna apenas 100 resultados para o próximo estágio.
O MongoDB não pode usar o índice para suportar query que incluem os seguinte campo, pois sem o campo item
, nenhum dos campo listados corresponde a um índice de prefixo:
o campo
location
,o campo
stock
, ouos campos
location
estock
.
Se você tiver uma collection que tenha um índice composto e um índice em seu prefixo (por exemplo, { a: 1, b: 1 }
e { a: 1 }
), se nenhum índice tiver uma restrição esparsa ou única, então você poderá remover o índice no prefixo (por exemplo { a: 1 }
). O MongoDB usará o índice composto em todas as situações que teria usado o índice prefixo.
Interseção de índice
A partir da versão 2.6, o MongoDB pode usar a interseção de índices para atender a consultas. A escolha entre criar índice composto que suporte suas query ou confiar na interseção de índices depende das especificidades do seu sistema. Consulte Interseção de índices e índices compostos para obter mais detalhes.
Índices de compostos esparsos
Os índices compostos podem conter diferentes tipos de índices esparsos. A combinação de tipos de índice determina como o índice composto corresponde aos documentos.
Esta tabela resume o comportamento de um índice composto que contém diferentes tipos de índices esparsos:
Componentes do índice composto | Comportamento do índice composto |
---|---|
Ascending indexes Descending indexes | Somente indexa documentos que contêm um valor para pelo menos uma das chaves. |
Indexa um documento somente quando ele contém um valor para um dos campos geospatial . Não indexa documentos nos índices crescentes ou decrescentes. | |
Somente indexa um documento quando ele corresponde a um dos campos text . Não indexa documentos nos índices crescentes ou decrescentes. |
Considerações adicionais
Durante a construção de índice, os aplicativos podem encontrar desempenho reduzido ou acesso limitado de leitura/gravação à coleção que está sendo indexada.
Para obter mais informações sobre o processo de construção de índices, consulte Construções de índices em collection preenchidas, especialmente a seção Construções de índices em ambientes replicados .
Alguns drivers usam NumberLong(1)
em vez de 1
para especificar a ordem do índice. Os índices resultantes são os mesmos.