索引

索引是跨多个数据存储区的常见概念,它可用于基于列(或一组列)更高效地进行查询.

单个列指定索引

不能使用数据批注创建索引,但您可以使用 "Fluent API" 按如下方式为单个列指定索引:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>().HasIndex(b => b.Url);
}

SQL为表Blogs创建一个索引,索引名称 IX_Blogs_Url

CREATE TABLE Blogs (Id INT PRIMARY KEY NOT NULL,Url VARCHAR(128) NOT NULL);
CREATE INDEX IX_Blogs_Url ON Blogs (Url ASC);

多个列指定索引:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .HasIndex(p => new { p.FirstName, p.LastName });
}

SQL为表Persons创建多索引,索引名称 IX_Persons_FirstName_LastName

CREATE INDEX IX_Persons_FirstName_LastName ON Persons (FirstName ASC,LastName ASC);

索引唯一性

默认情况下,索引不唯一,允许多行具有与索引的列集相同的值。 可以使索引唯一,如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasIndex(b => b.Url)
        .IsUnique();
}
CREATE TABLE Blogs (Id INT PRIMARY KEY NOT NULL,Url VARCHAR(128) NOT NULL);
CREATE UNIQUE INDEX IX_Blogs_Url ON Blogs (Url ASC);

索引名称

按照约定,在关系数据库中创建的索引将命名为 IX<type name><property name>。 对于复合索引, 变成以下划线分隔的属性名称列表。
您可以使用 "Fluent API" 设置在数据库中创建的索引的名称:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasIndex(b => b.Url)
        .HasName("Index_Url");
}

等效SQL

CREATE INDEX Index_Url ON Blogs (Url ASC);

索引筛选器

指定筛选索引或部分索引可以只为列的值的一个子集编制索引,从而减少索引的大小并改善性能和磁盘空间的使用情况。

神舟通用数据库暂不支持.

包含列

配置一组列包含在索引中,但不是其 "键" 的一部分, 当查询中的所有列都作为键列或非键列包含在索引中时,这可以显著提高查询性能,因为表本身不需要访问。

神舟通用数据库暂不支持.