Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
FS コア プロバイダー
/

インデックスによるクエリの最適化

このガイドでは、FS コア プロバイダーでインデックスを定義する方法を学びます。インデックスはクエリの効率を向上させ、ドキュメントのクエリと保存に機能を追加します。

インデックスがないと、 MongoDB はコレクション内のすべてのドキュメントをスキャンして 、各クエリに一致するドキュメントを見つける必要があります。これらのコレクションスキャンは遅く、アプリケーションのパフォーマンスに悪影響を与える可能性があります。ただし、クエリを カバー するインデックスを作成すると、 MongoDB はそのインデックスを使用して検査する必要があるドキュメントを制限できます。

クエリのパフォーマンスを向上させるには、ソートされた結果を返すアプリケーションのクエリや操作で頻繁に表示されるフィールドにインデックスをビルドします。追加する各インデックスはアクティブな場合にディスク領域とメモリを消費するため、キャパシティープランニングとしてインデックスメモリとディスク使用量を追跡することをお勧めします。

FS コア プロバイダーは次のタイプのインデックスをサポートしています。

  • 単一フィールド インデックス

  • 複合インデックス

  • Unique indexes

このガイドの例では、クイック スタートガイドで作成されたサンプルアプリケーションを使用します。クイック スタートアプリケーションを設定 したら、次の例に示すように、PlanetDbContextOnModelCreating() メソッドにコードを追加することで、このガイドの例を実行できます。

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

注意

FS コア プロバイダーは、dbContext.Database.EnsureCreated() メソッドを呼び出すとインデックスを作成します。インデックスが作成された後、 プロバイダーを使用してインデックスを変更または削除することはできません。アプリケーション内のインデックスを変更または削除する必要がある場合は、 .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 はインデックスのフィールドとオプションに基づいて、生成された名前でインデックスを作成します。インデックスのカスタム名を指定するには、インデックスを作成するときに名前を string として渡します。次の例では、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() メソッドを使用し、 .NET/ C#ドライバーの CreateIndexOptionsクラスのインスタンスを渡すことで、追加の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マニュアルの「 インデックスガイド 」を参照してください。

戻る

楽観的な同時実行性

項目一覧