Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

Optimiza queries con índices

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 query, construir índices sobre los campos que aparecen con frecuencia en las query de tu aplicación y en las operaciones que devuelven resultados ordenados. Cada índice que agregue consume espacio en disco y memoria cuando está activo, por lo que recomendamos que rastree la memoria del índice y el uso del disco para la planificación de la capacidad.

El Proveedor de EF Core admite los siguientes tipos de índices:

  • Índices de un solo campo

  • Índices compuestos

  • Unique indexes

  • Teclas alternativas

Los ejemplos en este guía utilizan la aplicación de muestra creada en la Guía de inicio rápido. Después de configurar la aplicación de inicio rápido, puedes 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 saber más sobre cómo trabajar con índices en el driver, consulta la guía de Índices en la documentación del driver .NET/C#.

Las siguientes secciones muestran cómo crear cada uno de los tipos de índices anteriores.

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.

Puedes crear un índice de un único campo llamando al método HasIndex() con una expresión lambda que especifique el campo 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");
});

Los índices compuestos son índices que abarcan varios campos dentro de los documentos de una colección. Estos índices mejoran el rendimiento de las query y la clasificación en múltiples campos.

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");
});

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");
});

Una clave alternativa sirve como identificador único alternativo para cada instancia de entidad, además de la clave principal. Cuando el proveedor de EF Core crea la base de datos, crea un índice único en la propiedad de la clave alternativa. Puede usar claves alternativas para garantizar la unicidad de una propiedad distinta de la clave principal.

Para crear una clave alternativa, llama al método HasAlternateKey() en una entidad y pasa una expresión lambda que especifique la propiedad que se usará como clave alternativa. El siguiente ejemplo crea una clave alternativa sobre la propiedad name de una entidad Planet:

modelBuilder.Entity<Planet>(p =>
{
p.HasAlternateKey(p => p.name);
p.ToCollection("planets");
});

También puede crear una clave alternativa compuesta, que combina varias propiedades para formar un identificador único. Una clave alternativa compuesta garantiza la unicidad en una combinación de propiedades, lo que significa que no puede haber dos entidades con los mismos valores para las propiedades especificadas. El siguiente ejemplo crea una clave alternativa compuesta en las propiedades name y orderFromSun:

modelBuilder.Entity<Planet>(p =>
{
p.HasAlternateKey(p => new { p.name, p.orderFromSun });
p.ToCollection("planets");
});

Puedes especificar opciones al crear tu índice para personalizar el nombre, las propiedades o el tipo de índice. Las siguientes secciones describen algunas de las opciones que puede especificar.

Por defecto, MongoDB crea un índice con un nombre generado en función de los campos y las opciones del índice. Para especificar un nombre personalizado para el índice, ingresa el nombre como una string al crear el índice. 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");
});

Por defecto, MongoDB crea índices en orden ascendente. Puedes llamar al método IsDescending() al crear un nuevo índice para que se cree el índice 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.

Puedes especificar opciones adicionales específicas de MongoDB al crear un índice utilizando el método HasCreateIndexOptions() y pasando una instancia de la clase CreateIndexOptions del controlador .NET/C#. Puedes pasar cualquier opción que sea compatible con la clase CreateIndexOptions. Para obtener más información sobre las opciones admitidas, consulta 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");
});

Para obtener más información sobre los índices en MongoDB, consulte la guía de índices en el manual del servidor MongoDB.

Volver

Concurrencia optimista

En esta página