Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
EF Core 提供程序
/

使用索引优化查询

在本指南中,您可以学习;了解如何在 EF Core 提供程序中定义索引。索引可以提高查询效率,并为查询和存储文档添加附加功能。

如果没有索引, MongoDB必须扫描集合中的每个文档,以查找与每个查询匹配的文档。这些集合扫描很慢,可能会对应用程序的性能产生负面影响。但是,如果您创建涵盖查询的索引,则MongoDB可以使用该索引来限制必须检查的文档。

若要提高查询性能,请对应用程序查询中经常出现的字段以及其他操作返回的排序结果中经常出现的字段构建索引。您添加的每个索引在活动状态下都会占用磁盘空间和内存,因此您应当跟踪索引内存和磁盘使用情况以进行容量规划。

EF Core 提供程序支持以下类型的索引:

  • 单字段索引

  • 复合索引

  • Unique indexes

本指南中的示例使用 快速入门指南中创建的示例应用程序。设立快速启动应用程序后,您可以通过将代码添加到 PlanetDbContextOnModelCreating() 方法来运行本指南中的示例,如以下示例所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Paste example code here
}

注意

调用 dbContext.Database.EnsureCreated() 方法时,EF Core 提供程序会创建索引。在创建索引后,您无法使用提供商修改或删除索引。如果需要修改或删除应用程序中的索引,则必须直接使用.NET/ C#驱动程序。

要学习;了解有关在驾驶员中使用索引的更多信息,请参阅.NET/ C#驱动程序文档中的索引指南。

以下部分介绍如何创建上述每种类型的索引。

单字段索引是引用集合文档中单个字段的索引。它们提高了单字段查询和排序性能。_id_索引是单字段索引的一个示例。

您可以通过使用指定要索引的字段的Lambda表达式调用 HasIndex() 方法来创建单字段索引。 以下示例在 Planet 实体上创建单字段索引:

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

复合索引是涵盖集合文档中多个字段的索引。这些索引提高了多字段查询和排序性能。

您可以通过使用指定要索引的字段的Lambda表达式调用 HasIndex() 方法来创建复合索引。 以下示例在 Planet 实体上创建复合索引:

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

唯一索引可确保多个文档不会包含相同的索引字段值。默认下, MongoDB在创建集合期间在 _id字段上创建唯一索引。您无法修改或删除此索引。

您可以使用 HasIndex() 方法创建索引(如前面部分所示),然后链式调用 IsUnique() 方法,从而创建唯一索引。以下示例在 Planet 实体上创建唯一索引:

modelBuilder.Entity<Planet>(p =>
{
p.HasIndex(p => p.orderFromSun).IsUnique();
p.ToCollection("planets");
});

您可以在创建索引时指定选项,以自定义索引名称、属性或索引类型。以下部分描述了您可以指定的一些选项。

默认下, MongoDB创建索引,并根据索引的字段和选项生成名称。要为索引指定自定义名称,请在创建索引时将该名称作为字符串传入。 以下示例在 Planet 实体上创建了一个名为 "named_order" 的复合索引:

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

默认下, MongoDB按升序创建索引。您可以在创建新索引时调用 IsDescending() 方法,按降序创建索引。以下示例在 Planet 实体上创建了一个降序索引:

modelBuilder.Entity<Planet>(p =>
{
p.HasIndex(p => p.orderFromSun).IsDescending();
p.ToCollection("planets");
});

注意

使用降序单字段索引可能会对索引性能产生负面影响。为获得最佳性能,请仅使用升序索引。

创建索引时,可以使用HasCreateIndexOptions() CreateIndexOptions方法并传入.NET/ C#驱动程序的 类的实例来指定其他特定于MongoDB的选项。您可以传入CreateIndexOptions 类支持的任何选项。要学习;了解有关支持的选项的更多信息,请参阅 CreateIndexOptions API文档。

以下示例创建一个索引并指定 Sparse 选项来创建稀疏索引:

modelBuilder.Entity<Planet>(p =>
{
p.HasIndex(p => p.orderFromSun)
.HasCreateIndexOptions(new CreateIndexOptions() { Sparse = true });
p.ToCollection("planets");
});

有关MongoDB中索引的更多信息,请参阅MongoDB Server手册中的索引指南。

后退

乐观并发

在此页面上