IndexesIndexes

インデックスは、多くのデータストアで共通の概念です。Indexes are a common concept across many data stores. データストアでの実装は異なる場合がありますが、列または列のセットに基づいて参照を作成するために使用されます。While their implementation in the data store may vary, they are used to make lookups based on a column (or set of columns) more efficient.

データ注釈を使用してインデックスを作成することはできません。Indexes cannot be created using data annotations. Fluent API を使用して、次のように1つの列にインデックスを指定できます。You can use the Fluent API to specify an index on a single column as follows:

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

複数の列に対してインデックスを指定することもできます。You can also specify an index over more than one column:

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

注意

規則により、外部キーとして使用される各プロパティ (またはプロパティのセット) にインデックスが作成されます。By convention, an index is created in each property (or set of properties) that are used as a foreign key.

EF Core では、個別のプロパティセットごとに1つのインデックスのみがサポートされます。EF Core only supports one index per distinct set of properties. Fluent API を使用して、既にインデックスが定義されている一連のプロパティ (規則または以前の構成) のインデックスを構成する場合は、そのインデックスの定義を変更します。If you use the Fluent API to configure an index on a set of properties that already has an index defined, either by convention or previous configuration, then you will be changing the definition of that index. これは、規則によって作成されたインデックスをさらに構成する場合に便利です。This is useful if you want to further configure an index that was created by convention.

インデックスの一意性Index uniqueness

既定では、インデックスは一意ではありません。複数の行がインデックスの列セットに対して同じ値を持つことができます。By default, indexes aren't unique: multiple rows are allowed to have the same value(s) for the index's column set. 次のように、インデックスを一意にすることができます。You can make an index unique as follows:

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

インデックスの列セットに同じ値を持つ複数のエンティティを挿入しようとすると、例外がスローされます。Attempting to insert more than one entity with the same values for the index's column set will cause an exception to be thrown.

インデックス名Index name

慣例により、リレーショナルデータベースに作成されたインデックスにはという名前が付けられ IX_<type name>_<property name> ます。By convention, indexes created in a relational database are named IX_<type name>_<property name>. 複合インデックスの場合、は、 <property name> アンダースコアで区切られたプロパティ名のリストになります。For composite indexes, <property name> becomes an underscore separated list of property names.

Fluent API を使用して、データベースに作成されたインデックスの名前を設定できます。You can use the Fluent API to set the name of the index created in the database:

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

インデックスフィルターIndex filter

一部のリレーショナルデータベースでは、フィルター処理されたインデックスまたは部分的なインデックスを指定できます。Some relational databases allow you to specify a filtered or partial index. これにより、列の値のサブセットにのみインデックスを作成し、インデックスのサイズを小さくして、パフォーマンスとディスク領域の使用率を向上させることができます。This allows you to index only a subset of a column's values, reducing the index's size and improving both performance and disk space usage. フィルター選択されたインデックス SQL Server の詳細については、 のドキュメントを参照してくださいFor more information on SQL Server filtered indexes, see the documentation.

Fluent API を使用して、SQL 式として指定されたインデックスにフィルターを指定できます。You can use the Fluent API to specify a filter on an index, provided as a SQL expression:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasIndex(b => b.Url)
        .HasFilter("[Url] IS NOT NULL");
}

SQL Server プロバイダー EF を使用すると、 'IS NOT NULL' 一意のインデックスの一部である null 許容型のすべての列に対してフィルターが追加されます。When using the SQL Server provider EF adds an 'IS NOT NULL' filter for all nullable columns that are part of a unique index. この規則をオーバーライドするには、 null 値を指定します。To override this convention you can supply a null value.

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

[付加列]Included columns

一部のリレーショナルデータベースでは、インデックスに含まれるが、"キー" の一部ではない列のセットを構成できます。Some relational databases allow you to configure a set of columns which get included in the index, but aren't part of its "key". これにより、テーブル自体にアクセスする必要がないため、クエリ内のすべての列がキー列または非キー列としてインデックスに含まれる場合、クエリのパフォーマンスが大幅に向上します。This can significantly improve query performance when all columns in the query are included in the index either as key or nonkey columns, as the table itself doesn't need to be accessed. 付加列 SQL Server の詳細については、 のドキュメントを参照してくださいFor more information on SQL Server included columns, see the documentation.

次の例では、 Url 列がインデックスキーの一部であるため、その列に対するクエリフィルター処理でインデックスを使用できます。In the following example, the Url column is part of the index key, so any query filtering on that column can use the index. さらに、 Title 列と列にのみアクセス PublishedOn するクエリは、テーブルにアクセスする必要がなく、より効率的に実行されます。But in addition, queries accessing only the Title and PublishedOn columns will not need to access the table and will run more efficiently:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Post>()
        .HasIndex(p => p.Url)
        .IncludeProperties(p => new
        {
            p.Title,
            p.PublishedOn
        });
}