Indexes
Nesta página
Visão geral
Nesta aba, você pode aprender como usar índices no Go Driver do MongoDB.
Os índices suportam a execução eficiente de queries no MongoDB. Sem índices, o MongoDB escaneia cada documento em uma collection (um escaneamento de collection) para encontrar documentos que correspondam à sua query. Os escaneamentos de collections são lentos e podem afetar negativamente o desempenho do seu aplicativo. Com um índice apropriado, o MongoDB limita o número de documentos inspecionados.
Dica
Você também pode usar índices em operações de atualização, operações de exclusão e determinados estágios do pipeline de agregação.
Cobertura e desempenho da query
Uma consulta no MongoDB pode conter os seguintes elementos:
Elemento | necessidade | Propósito |
---|---|---|
Query | Obrigatório | Especificar os campos e valores que você está procurando. |
Opções | Opcional | Especifique como a query é executada. |
Projeção | Opcional | Especificar os campos que o MongoDB deve retornar. |
Sort | Opcional | Especificar a ordem em que o MongoDB retorna os documentos. |
Ao especificar esses elementos no mesmo índice, o MongoDB gera resultados diretamente do índice, também chamado de query coberta.
Importante
Critérios de classificação
Seus critérios de classificação devem corresponder ou inverter a ordem do índice.
Considere um índice no campo name
em ordem crescente (A-Z) e age
em ordem decrescente (9-0):
name_1_age_-1
O MongoDB usa esse índice quando você classifica seus dados por:
name
ascendente, descendenteage
name
descendente, ascendenteage
Especificar uma ordem de classificação de name
e age ascendente ou name e age
descendente exigiria uma classificação na memória.
Para saber como garantir que seu índice cubra seus critérios de query e projeção, consulte Cobertura de query.
Considerações operacionais
Para melhorar o desempenho de sua consulta, crie índices em campos que aparecem com frequência em suas consultas e operações que retornam resultados ordenados. Você deve monitorar a memória do índice e o uso do disco para o planejamento da capacidade, pois cada índice adicionado consome espaço em disco e memória. Além disso, quando uma operação de gravação atualiza um campo indexado, MongoDB também tem que atualizar o índice relacionado.
Como o MongoDB suporta esquemas dinâmicos, seu aplicação pode consultar em campos com nomes atualmente desconhecidos ou arbitrários. O MongoDB 4.2 introduziu índices curinga para ajudar a suportar essas queries. Os índices curinga não são projetados para substituir o planejamento de índice baseado em volume de trabalho.
Para saber mais sobre como criar seu modelo de dados e escolher índices apropriados para seu aplicativo, consulte Estratégias de Indexação e Modelagem de Dados e Índices.
Tipos de índice
O MongoDB suporta vários tipos de índice para possibilitar a execução de queries nos seus dados. As seções a seguir descrevem e mostram como criar os tipos de índice mais comuns. Para ver uma lista completa dos tipos de índice, consulte a página Índices.
Índices de campo único
Os índices de campo único mantêm uma referência a um campo dentro dos documentos de uma coleção.
Esse índice melhora as consultas de campo único e o desempenho da classificação, além de oferecer suporte a índices TLL que removem automaticamente documentos de uma coleção após um determinado período de tempo.
Observação
O índice _id_
é um exemplo de um único índice de campo. Este índice é criado automaticamente no campo _id
quando você cria uma nova coleção.
Exemplo
O exemplo seguinte cria um índice em ordem crescente no campo title
na coleção sample_mflix.movies
:
indexModel := mongo.IndexModel{ Keys: bson.D{{"title", 1}} } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Índices compostos
Os índices compostos mantêm uma referência a vários campos dentro dos documentos de uma coleção. Este índice melhora o desempenho de consulta e classificação.
Exemplo
O exemplo seguinte cria um índice composto nos campos fullplot
e title
na collection sample_mflix.movies
:
indexModel := mongo.IndexModel{ Keys: bson.D{ {"fullplot", -1}, {"title", 1} } } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Índices de várias teclas (índices em campos de array)
Os índices de múltiplas chaves utilizam a mesma sintaxe que um índice de campo único e um índice composto. Este índice melhora o desempenho de consultas que especificam um campo de matriz como um índice.
Exemplo
O exemplo seguinte cria um índice de múltiplas chaves no campo cast
na collection sample_mflix.movies
:
indexModel := mongo.IndexModel{ Keys: bson.D{{"cast", -1}} } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Í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 criar um índice de cluster, especifique a opção de índice de cluster com o campo _id
como a chave e o campo único como true
ao criar a collection.
Exemplo
O exemplo seguinte cria um índice agrupado no campo _id
na coleção tea.vendors
:
db := client.Database("tea") cio := bson.D{{"key", bson.D{{"_id", 1}}}, {"unique", true}} opts := options.CreateCollection().SetClusteredIndex(cio) db.CreateCollection(context.TODO(), "vendors", opts)
Text Indexes
Índices de texto oferecem suporte a pesquisas de query de texto no conteúdo da string. Este índice exige um campo de string ou uma array de strings. O MongoDB suporta pesquisa de texto para vários idiomas. Você pode especificar o idioma padrão como uma opção ao criar o índice.
Uma collection só pode conter um índice de texto. Se você deseja criar um índice de texto para múltiplos campos de texto, você precisa criar um índice composto. A pesquisa de texto é executada em todos os campos de texto dentro do índice composto.
Dica
Os índices de texto diferem dos Atlas Full Text Search índices mais poderosos do . Os usuários do Atlas devem usar o Atlas Search.
Exemplo
O exemplo seguinte cria um índice de texto no campo plot
com italian
como o idioma padrão na coleção sample_mflix.movies
:
indexModel := mongo.IndexModel{Keys: bson.D{{"title", 1}}} name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Índices geoespaciais
O MongoDB suporta queries contendo de dados de coordenadas geoespaciais usando índices 2dsphere. Um índice 2dsphere
deve estar em um campo de objetos GeoJSON.
Este índice permite que você execute o seguinte:
Consulta dados geoespaciais para inclusão, interseção e proximidade.
Cálculo de distâncias em um plano euclidiano e para trabalhar com a sintaxe de "pares de coordenadas legados" usada no MongoDB 2.2 e anteriores.
Exemplo
O campo location.geo
em um documento da collection sample_mflix.theaters
é um objeto de ponto GeoJSON que descreve as coordenadas do teatro:
{ "_id" : ObjectId("59a47286cfa9a3a73e51e75c"), "theaterId" : 104, "location" : { "address" : { "street1" : "5000 W 147th St", "city" : "Hawthorne", "state" : "CA", "zipcode" : "90250" }, "geo" : { "type" : "Point", "coordinates" : [ -118.36559, 33.897167 ] } } }
O seguinte exemplo cria um índice 2dsphere
no campo location.geo
:
Importante
Tentar criar um índice geoespacial em um campo que é coberto por um índice geoespacial resulta em um erro.
indexModel := mongo.IndexModel{ Keys: bson.D{{"location.geo", "2dsphere"}} } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Unique Indexes
Índices únicos garantem que os campos indexados não armazenem valores duplicados. Por padrão, o MongoDB cria um índice único no campo _id
durante a criação de uma coleção.
Para criar um índice exclusivo, especifique o campo ou a combinação de campos em que você deseja evitar a duplicação e defina a opção unique
como true
.
Exemplo
O exemplo seguinte cria um índice descendente único no campo theaterId
:
indexModel := mongo.IndexModel{ Keys: bson.D{{"theaterId", -1}}, Options: options.Index().SetUnique(true), } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Remover um Índice
Você pode remover qualquer índice não utilizado, exceto o índice único padrão no campo _id
. Para remover um índice, passe o nome do seu índice para o método DropOne()
.
O exemplo seguinte remove um índice ascendente no campo title
na collection sample_mflix.movies
:
res, err := coll.Indexes().DropOne(context.TODO(), "title_1") if err != nil { panic(err) } fmt.Println(res)
Informações adicionais
Para saber mais sobre os índices mencionados, consulte as seguintes guias:
Para saber mais sobre as operações mencionadas, consulte os seguintes guias:
Documentação da API
Para saber mais sobre qualquer um dos métodos discutidos nesta guia, consulte a seguinte documentação da API: