Indexes
Nesta página
Visão geral
Neste guia, você pode aprender como usar o driver Rust para criar e gerenciar índices. Os índices são estruturas de dados especiais que melhoram o desempenho das consultas no MongoDB.
Se você realizar uma consulta em uma coleção sem nenhum índice, o MongoDB examinará todos os documentos para encontrar correspondências. Essas verificações da coleção são lentas e podem afetar negativamente o desempenho do seu aplicativo. Quando você cria um índice que abrange sua consulta, o MongoDB limita o número de documentos que inspeciona para encontrar correspondências, o que resulta em melhor desempenho.
Dica
Você pode usar índices em operações de atualização, excluir operações e alguns estágios do pipeline de agregação. Para saber mais sobre o uso de índices em agregações, consulte Melhorar o desempenho com índices e filtros de documentos no manual do servidor MongoDB.
Cobertura e desempenho da query
A tabela a seguir descreve os elementos que você pode incluir em uma query do MongoDB:
Elemento | Descrição |
---|---|
Query | Required Specifies the fields and values to match |
Opções | Optional Specify how the query executes |
Projeção | Optional Specifies the fields that MongoDB returns in matched
documents |
Sort | Optional Specifies the order of documents returned |
Quando seus elementos de query fazem referência a campos que estão todos incluídos no mesmo índice, o MongoDB pode retornar resultados diretamente do índice. Essas queries são chamadas de queries cobertas.
Para saber como garantir que seu índice cubra sua query, consulte Query coberta no manual do servidor.
Importante
Critérios de classificação
Seus critérios de classificação devem corresponder ou inverter a ordem do índice.
Suponha que uma collection tenha o seguinte índice no campo name
em ordem crescente (AZ) e no campo age
em ordem decrescente (9-0):
name_1_age_-1
O MongoDB usa esse índice quando você classifica documentos em uma das seguintes configurações:
name
ascendente, descendenteage
name
descendente, ascendenteage
Se você especificar a mesma ordem de classificação para ambos os campos, o MongoDB não utilizará o índice e, em vez disso, executará uma classificação na memória.
Considerações operacionais
Para melhorar o desempenho de sua query, crie índices em campos que aparecem com frequência em suas queries. No entanto, é uma boa prática acompanhar a memória do índice e o uso do disco para o planejamento da capacidade, pois cada índice consome espaço em disco e memória. Além disso, se uma operação de gravação atualizar um campo indexado, o MongoDB também deverá atualizar o índice relevante.
O MongoDB oferece suporte a esquemas dinâmicos, para que seu aplicativo possa consultar em campos com nomes desconhecidos ou de variáveis. Se você estiver conectado à versão 4.2 ou posterior do MongoDB Server , poderá criar índices curinga para dar suporte a essas queries. Para saber mais sobre esse tipo de índice, consulte Índices curinga no manual do servidor MongoDB.
Tipos de índice
O MongoDB suporta vários tipos de índice para dar suporte às suas query. As seções a seguir descrevem os tipos de índice comuns e mostram como criar cada tipo de índice em uma coleção.
Observação
collection de amostras
Os exemplos neste guia utilizam collections dos dados de amostra do Atlas. Para saber como importar esses dados, consulte o tutorial Carregar dados de amostra na documentação do Atlas.
Você pode utilizar os métodos create_index()
e create_indexes()
para criar índices em uma collection. O método create_index()
usa um parâmetro de estrutura IndexModel
que você pode construir usando o método builder()
do tipo.
Para ver uma lista completa dos tipos de índice, consulte Tipos de índice no manual do servidor MongoDB.
Índices de campo único
Um único índice de campo mantém uma referência a um campo do documento.
Este índice melhora o desempenho de consultas e classificações de campo único. Ele também suporta índices TTL que removem automaticamente documentos de uma coleção após um determinado período de tempo. Para saber mais sobre os índices TTL, consulte Índices TTL no manual do servidor.
Quando você cria uma nova coleção, o MongoDB cria automaticamente um índice de campo único e exclusivo no campo _id
.
Exemplo
O seguinte código cria um índice ascendente no campo city
na collection sample_training.zips
:
let index = IndexModel::builder().keys(doc! { "city": 1 }).build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: city_1
Índices compostos
Um índice composto mantém uma referência a vários campos do documento.
Este índice melhora o desempenho de query e classificações em vários campo. Ao criar um índice composto, você deve especificar uma direção para cada um dos campos indexados.
Você pode criar um índice de múltiplas chaves utilizando a mesma sintaxe para criar um índice de campo único.
Exemplo
O seguinte código cria um índice composto nos campos city
e pop
na collection sample_training.zips
:
let index = IndexModel::builder() .keys(doc! { "city": 1, "pop": -1 }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: city_1_pop_-1
Índices de várias teclas (índices de campo de array)
Um índice de múltiplas chaves mantém uma referência a um campo com valor de array. Este índice melhora o desempenho das query nos campo da matriz.
Você pode criar um índice de múltiplas chaves utilizando a mesma sintaxe para criar um índice de campo único.
Exemplo
O seguinte código cria um índice de múltiplas chaves no campo tags
na collection sample_training.posts
:
let index = IndexModel::builder().keys(doc! { "tags": 1 }).build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: tags_1
Índices aglomerados
Os índices clusterizados melhoram o desempenho das operações de inserção, atualização e exclusão em coleções clusterizadas. Coleções clusterizadas armazenam documentos ordenados pelo valor da chave do índice agrupado. Para saber mais sobre essas coleções, consulte Coleções clusterizadas no manual do Servidor.
Você pode criar um índice agrupado somente ao criar uma collection. Para criar uma collection clusterizada, execute as seguintes etapas:
Crie uma instância
ClusteredIndex
.Chame o método
create_collection()
.Encadeie o método
clustered_index()
ao métodocreate_collection()
, passando sua instânciaClusteredIndex
como parâmetro declustered_index()
.
Você deve definir os seguintes campos da estrutura ClusteredIndex
:
O campo
key
, que especifica o padrão de chave. O valor deste campo deve ser{ _id: 1 }
.O campo
unique
, que especifica a singularidade do índice. O valor deste campo deve sertrue
.
Para criar uma instância do ClusteredIndex
que utiliza automaticamente os valores exigidos, você pode chamar o método default()
do tipo.
Exemplo
O código a seguir cria um índice clusterizado com a configuração padrão no campo _id
ao criar uma nova collection chamada items
no reconhecimento de data center sample_training
:
let db = client.database("sample_training"); let cl_idx = ClusteredIndex::default(); db.create_collection("items") .clustered_index(cl_idx) .await?;
Text Indexes
Um índice de texto oferece suporte a query de pesquisa no conteúdo da string. Esse índice faz referência a um campo com um valor de string ou um valor de array de string. O MongoDB suporta pesquisa de texto para vários idiomas. Ao criar um índice de texto, você pode especificar o idioma padrão como uma opção.
Uma collection só pode conter um índice de texto. Para criar um índice de texto em múltiplos campos de texto, você pode criar um índice composto. Quando você executa uma Atlas Search de texto após criar um índice composto, a operação Atlas Search é executada em todos os campos de texto no índice composto.
Dica
Atlas Full Text Search do Atlas
Os índices de texto são diferentes dos índices do Atlas Full Text Search . Para saber mais sobre os índices do Atlas Search , consulte o guia Índices do Atlas Search .
Exemplo
O seguinte código cria um índice de texto no campo body
na collection sample_training.posts
. O código define uma opção para especificar "spanish"
como o idioma padrão para o índice de texto:
let idx_opts = IndexOptions::builder() .default_language("spanish".to_string()) .build(); let index = IndexModel::builder() .keys(doc! { "body": "text" }) .options(idx_opts) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: body_"text"
Índices geoespaciais
O MongoDB suporta query contendo de dados de coordenadas geoespaciais usando índices 2dsphere
. Você pode criar um índice 2dsphere
em um campo com valores de objeto GeoJSON.
Esse tipo de índice suporta as seguintes tarefas:
Query em dados geoespaciais para encontrar inclusão, interseção e proximidade
Cálculo de distâncias em um plano euclidiano
Importante
Você não pode criar dois índices geoespaciais no mesmo campo.
Exemplo
O seguinte documento de amostra na collection sample_mflix.theaters
contém o campo location.geo
. Este campo tem um valor de ponto GeoJSON:
{ "_id": ..., "theaterId": ..., "location": { "address": ..., "geo": { "type": "Point", "coordinates": [ -93.24565, 44.85466 ] } } }
O seguinte código cria um índice geoespacial 2dsphere
no campo location.geo
na collection sample_mflix.theaters
:
let index = IndexModel::builder() .keys(doc! { "location.geo": "2dsphere" }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: location.geo_"2dsphere"
Unique Indexes
Um índice único garante que os campos indexados não armazenem valores duplicados. Por padrão, o MongoDB cria um índice de campo único exclusivo no campo _id
quando você cria uma collection.
Para criar um índice exclusivo, especifique o campo ou a combinação de campos para os quais você deseja manter a exclusividade e defina a opção unique
como true
.
Exemplo
O código a seguir mostra como definir o campo unique
como true
em uma instância IndexOptions
e passar essas opções ao criar um IndexModel
:
let opts = IndexOptions::builder().unique(true).build(); let index = IndexModel::builder() .keys(doc! { "_id": -1 }) .options(opts) .build();
Remover um Índice
Você pode remover ou descartar qualquer índice de uma collection, exceto o índice único padrão no campo _id
. Para remover um índice, passe o nome do índice para o método drop_index()
.
Dica
Remover todos os índices
Você pode remover todos os índices em uma collection, exceto o índice _id
de uma só vez usando o método drop_indexes()
.
O exemplo a seguir remove um índice chamado city_1
da collection sample_training.zips
:
my_coll.drop_index("city_1".to_string()).await?;
Informações adicionais
Para saber mais sobre como projetar modelos de dados e criar índices apropriados para seu aplicativo, consulte Estratégias de indexação e Fatores operacionais e modelos de dados no manual do servidor MongoDB.
Para saber sobre como realizar operações de leitura, consulte os guias na categoria Operações de leitura .
Para saber mais sobre os conceitos mencionados neste guia, consulte a seguinte documentação do servidor:
Documentação da API
Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo: