Visão geral
Neste guia, você pode aprender como definir índices no provedor do EF Core. Os índices podem melhorar a eficiência das queries e adicionar funcionalidades à consulta e ao armazenamento de documentos.
Sem índices, o MongoDB deve digitalizar todos os documento em uma collection para encontrar os documentos que correspondem a cada query. Essas verificações da collection são lentas e podem afetar negativamente o desempenho do seu aplicação. No entanto, se você criar um índice que cubra uma query, o MongoDB poderá usar o índice para limitar os documentos que deve inspecionar.
Para melhorar o desempenho da query, crie índices em campos que aparecem com frequência nas queries e operações do seu aplicativo que retornam resultados ordenados. Cada índice adicionado consome espaço em disco e memória quando ativo, portanto, recomendamos que você rastreie a memória do índice e o uso do disco para o planejamento da capacidade.
Crie um índice
O provedor do EF Core suporta os seguintes tipos de índices:
Os exemplos deste guia usam o aplicação de amostra criado no guia deInício Rápido . Após configurar o aplicação de início rápido , você pode executar os exemplos neste guia adicionando o código ao método OnModelCreating()
do PlanetDbContext
, como mostrado no seguinte exemplo:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Paste example code here }
Observação
O EF Core Provider cria seus índices quando você chama o método dbContext.Database.EnsureCreated()
. Você não pode modificar ou excluir índices usando o provedor depois que eles são criados. Se você precisar modificar ou excluir um índice em seu aplicação, deverá usar o driver .NET/C# diretamente.
Para saber mais sobre como trabalhar com índices no driver, consulte o guia Índices na documentação do driver .NET/C#.
As seções a seguir mostram como criar cada um dos tipos anteriores de índices.
Índice de campo único
Índices de campo único são índices com uma referência a um único campo dentro dos documentos de uma coleção. Elas melhoram a consulta de campo único e o desempenho da classificação. O índice _id_
é um exemplo de um único índice de campo .
Você pode criar um único índice de campo chamando o método HasIndex()
com uma expressão Lambda que especifica o campo a ser indexado. O exemplo seguinte cria um índice de campo único em uma entidade Planet
:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun); p.ToCollection("planets"); });
Índice composto
Índices compostos são índices que cobrem vários campos dentro dos documentos de uma coleção. Esses índices melhoram a consulta de vários campos e o desempenho de classificação.
Você pode criar um índice composto chamando o método HasIndex()
com uma expressão Lambda que especifica os campos a serem indexados. O exemplo seguinte cria um índice composto em uma entidade Planet
:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => new { p.orderFromSun, p.name }); p.ToCollection("planets"); });
índice único
Índices únicos garantem que vários documentos não contenham o mesmo valor para o campo indexado. Por padrão, o MongoDB cria um índice único no campo _id
durante a criação de uma collection. Você não pode modificar ou remover este índice.
Você pode criar um índice único criando um índice usando os métodos HasIndex()
, conforme mostrado nas seções anteriores, e, em seguida, encadeando o método IsUnique()
. O exemplo seguinte cria um índice único em uma entidade Planet
:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun).IsUnique(); p.ToCollection("planets"); });
Opções de índice
Você pode especificar opções ao criar seu índice para personalizar o nome, as propriedades ou o tipo de índice. As seções a seguir descrevem algumas das opções que você pode especificar.
Índice nomeado
Por padrão, o MongoDB cria um índice com um nome gerado com base nos campos e opções do índice. Para especificar um nome personalizado para o índice, passe o nome como uma string ao criar o índice. O exemplo seguinte cria um índice composto na entidade Planet
com o nome "named_order"
:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => new { p.orderFromSun, p.name }, "named_order"); p.ToCollection("planets"); });
Ordem do índice
Por padrão, o MongoDB cria índices em ordem crescente. Você pode chamar o método IsDescending()
ao criar um novo índice para criar o índice em ordem decrescente. O exemplo seguinte cria um índice descendente em uma entidade Planet
:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun).IsDescending(); p.ToCollection("planets"); });
Observação
Usar um índice de campo único descendente pode impacto negativamente o desempenho do índice. Para obter o melhor desempenho, use apenas índices ascendentes.
MongoDB-Opções específicas
Você pode especificar opções adicionais específicas do MongoDB ao criar um índice usando o método HasCreateIndexOptions()
e passando uma instância da classe CreateIndexOptions
do driver .NET/C#. Você pode passar em quaisquer opções que a classe CreateIndexOptions
suporta. Para saber mais sobre as opções compatíveis, consulte a documentação da API CreateIndexOptions.
O exemplo seguinte cria um índice e especifica a opção Sparse
para criar um índice esparso:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun) .HasCreateIndexOptions(new CreateIndexOptions() { Sparse = true }); p.ToCollection("planets"); });
Informações adicionais
Para obter mais informações sobre índices no MongoDB, consulte o guia Índices no manual do MongoDB Server.