Overview
En esta guía puedes aprender cómo definir índices en el proveedor EF Core. Los índices pueden mejorar la eficiencia de las queries y añadir funcionalidades adicionales al consultar queries y almacenar documentos.
Sin índices, MongoDB debe escanear todos los documentos de una colección para encontrar los documentos que coincidan con cada query. Estos escaneos de colección son lentos y pueden afectar negativamente el rendimiento de tu aplicación. Sin embargo, si creas un índice que cubra una query, MongoDB puede utilizar el índice para limitar los documentos que debe inspeccionar.
Para mejorar el rendimiento de las consultas, cree índices en los campos que aparecen con frecuencia en las consultas y operaciones de su aplicación que devuelven resultados ordenados. Cada índice que agregue consume espacio en disco y memoria cuando está activo, por lo que le recomendamos que realice un seguimiento del uso de memoria y disco del índice para planificar la capacidad.
Crear un índice
El proveedor principal de EF admite los siguientes tipos de índices:
Los ejemplos de esta guía utilizan la aplicación de muestra creada en el
Guía deinicio rápido. Después de configurar la aplicación de inicio rápido, puede ejecutar los ejemplos de esta guía agregando el código a la
OnModelCreating() método del PlanetDbContext, como se muestra en el siguiente ejemplo:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Paste example code here }
Nota
El proveedor de EF Core crea sus índices al llamar al método dbContext.Database.EnsureCreated(). No puede modificar ni eliminar índices mediante el proveedor una vez creados. Si necesita modificar o eliminar un índice en su aplicación, debe usar directamente el controlador .NET/C#.
Para obtener más información sobre cómo trabajar con índices en el controlador, consulte la guía Índices en la documentación del controlador .NET/C#.
Las siguientes secciones muestran cómo crear cada uno de los tipos de índices anteriores.
Índice de un solo campo
Los índices de campo único son índices que hacen referencia a un solo campo dentro de los documentos de una colección. Mejoran el rendimiento de las consultas y la ordenación de campos únicos. El _id_ índice es un ejemplo de índice de campo único.
Puede crear un índice de campo único llamando al método HasIndex() con una expresión lambda que especifique el campo que se va a indexar. El siguiente ejemplo crea un índice de campo único en una entidad Planet:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun); p.ToCollection("planets"); });
Índice compuesto
Los índices compuestos abarcan varios campos dentro de los documentos de una colección. Estos índices mejoran el rendimiento de las consultas y la ordenación multicampo.
Puede crear un índice compuesto llamando al método HasIndex() con una expresión lambda que especifique los campos que se indexarán. El siguiente ejemplo crea un índice compuesto en una entidad Planet:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => new { p.orderFromSun, p.name }); p.ToCollection("planets"); });
Índice único
Los índices únicos garantizan que varios documentos no contengan el mismo valor para el campo indexado. De forma predeterminada, MongoDB crea un índice único en el campo _id durante la creación de una colección. Este índice no se puede modificar ni eliminar.
Puede crear un índice único utilizando los métodos HasIndex(), como se muestra en las secciones anteriores, y luego encadenando el método IsUnique(). El siguiente ejemplo crea un índice único en una entidad Planet:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun).IsUnique(); p.ToCollection("planets"); });
Opciones del índice
Al crear el índice, puede especificar opciones para personalizar el nombre, las propiedades o el tipo de índice. Las siguientes secciones describen algunas de las opciones que puede especificar.
Índice con nombre
De forma predeterminada, MongoDB crea un índice con un nombre generado según sus campos y opciones. Para especificar un nombre personalizado, introdúzcalo como cadena al crearlo. El siguiente ejemplo crea un índice compuesto en la entidad Planet con el nombre "named_order":
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => new { p.orderFromSun, p.name }, "named_order"); p.ToCollection("planets"); });
Orden de índice
De forma predeterminada, MongoDB crea índices en orden ascendente. Puede llamar al método IsDescending() al crear un nuevo índice para crearlo en orden descendente. El siguiente ejemplo crea un índice descendente en una entidad Planet:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun).IsDescending(); p.ToCollection("planets"); });
Nota
Usar un índice de campo único descendente podría afectar negativamente el rendimiento del índice. Para un rendimiento óptimo, utilice únicamente índices ascendentes.
Opciones específicas de MongoDB
Puede especificar opciones adicionales específicas de MongoDB al crear un índice mediante el HasCreateIndexOptions() método y pasando una instancia de la CreateIndexOptions clase del controlador .NET/C#. Puede pasar cualquier opción compatible con la CreateIndexOptions clase. Para obtener más información sobre las opciones compatibles, consulte la documentación de la API CreateIndexOptions.
El siguiente ejemplo crea un índice y especifica la Sparse opción para crear un índice disperso:
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun) .HasCreateIndexOptions(new CreateIndexOptions() { Sparse = true }); p.ToCollection("planets"); });
Información Adicional
Para obtener más información sobre los índices en MongoDB, consulte la guía de índices en el manual del servidor MongoDB.