Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

クエリをサポートするインデックスの作成

項目一覧

  • このタスクについて
  • 手順
  • 詳細

インデックスは、クエリによってスキャンされたすべてのフィールドがインデックスに含まれている場合にクエリを カバー します。 カバード クエリは、コレクションではなくインデックスをスキャンするため、クエリのパフォーマンスが向上します。

クエリされたフィールドのサブセットがインデックス化されている場合は、インデックスも部分的にクエリをサポートできます。

単一コレクションには最大64インデックスを含めることができます。 ただし、インデックスが多すぎると、その制限に達する前にパフォーマンスが低下する可能性があります。 書き込みと読み取りの比率が高いコレクションでは、挿入のたびにすべてのインデックスもアップデートする必要があるため、インデックスによってパフォーマンスが低下する可能性があります。

1

アプリケーション内の一般的なクエリ パターンを識別するには、 $queryStats集計ステージを使用します。 $queryStatsは、共有フィールドに基づいてクエリをグループ化するクエリシェイプのメトリクスを報告します。

2

アプリケーションが頻繁にクエリを実行するフィールドがわかったら、それらのフィールドに対するクエリをサポートするインデックスを作成できます。 詳細については、「 例 」を参照してください。

3

アプリケーションでインデックスの使用を開始したら、インデックスの有効性を分析できます。 インデックスの統計と使用状況を確認するには、以下のコマンドを実行します。

  • $indexStats集計ステージを使用します。

  • MongoDB Atlas配置の場合、 Atlas UIのインデックスを表示 します。

アプリケーションのパフォーマンスを向上させるために、未使用のインデックスを削除することを検討します。 詳細については、「不要なインデックスの削除 」を参照してください。

この手順を定期的に繰り返し、インデックスが現在のワークロードをサポートしていることを確認します。

アプリケーションが 特定のコレクション内の単一のキーに対してのみクエリを実行する場合は、そのコレクションに対して 単一キーインデックスを作成する必要があります。 例、 productコレクション内のcategoryにインデックスを作成できます。

db.products.createIndex( { category: 1 } )

上記のインデックスはこのクエリをサポートします。

db.products.find( { category: "electronics" } )

アプリケーションが単一のキーと複数のキーの両方に対してクエリを実行する場合、複合インデックスは単一キーインデックスよりも効率的です。 例、 categoryitemlocationフィールドにインデックスを作成できます。

db.products.createIndex( { category: 1, item: 1, location: 1 } )

複合インデックスは、インデックス フィールドの開始サブセットであるインデックスプレフィックスに対するクエリをサポートします。 例、前述のインデックスは次のクエリをサポートしています。

db.products.find( { category: "electronics" } )
db.products.find( { category: "electronics", item: "television" } )

インデックスプレフィックスに関する詳細とパフォーマンスに関する考慮事項については、「インデックス プレフィックス 」を参照してください。

MongoDB Atlas でホストされているデータの場合、Atlas Search インデックスを使用した全文検索をサポートできます。 詳しくは「 Atlas Search インデックスの作成 」を参照してください。

自己管理型(Atlas 以外)の配置の場合、MongoDB はコレクション内の string コンテンツの検索をサポートするtextインデックス型を提供します。 自己管理型テキストインデックスについて詳しくは、「自己管理型配置のテキストインデックス 」を参照してください。

ベクトル検索インデックスはベクトル埋め込みに対するクエリをサポートします。 ベクトル検索インデックスを作成するには、「 ベクトル検索のインデックスベクトル検索」を参照してください。

文字列の比較にインデックスを使用するには、操作で同じ照合も指定する必要があります。つまり、照合順序を持つインデックスでは、操作で異なる照合順序が指定されている場合、インデックス付きフィールドで文字列比較を実行する操作をサポートできません。

警告

照合が構成されたインデックスは、並べ替え順序を実現するために ICU 照合キーを使用するため、照合対応のインデックス キーは、照合のないインデックスのインデックス キーよりも大きくなる可能性があります。

たとえば、コレクション myColl には、照合ロケール "fr" を持つ文字列フィールド category のインデックスがあります。

db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

インデックスと同じ照合を指定する次のクエリ操作では、インデックスを使用できます。

db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

ただし、デフォルトで「シンプル」なバイナリー コレータを使用する次のクエリ操作では、インデックスを使用できません。

db.myColl.find( { category: "cafe" } )

インデックス プレフィックスキーが文字列、配列、および埋め込みドキュメントではない複合インデックスの場合でも、異なる照合を指定する操作では、インデックスを使用してインデックス プレフィックスキーの比較をサポートできます。

たとえば、myColl コレクションには、数値フィールドの scoreprice、および 文字列フィールドの category の複合インデックスがあります。このインデックスは、文字列比較用の照合ロケール "fr" を使用して作成されます。

db.myColl.createIndex(
{ score: 1, price: 1, category: 1 },
{ collation: { locale: "fr" } } )

文字列の比較に "simple" バイナリ照合を使用する次の操作では、インデックスを使用できます。

db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )

次の操作では、"simple" バイナリ照合を使用してインデックス付きの category フィールドで文字列を比較しますが、クエリの score: 5 部分の実行についてはインデックスが使用できます。

db.myColl.find( { score: 5, category: "cafe" } )

重要

ドキュメント キーとの照合(埋め込みドキュメントのキーを含む)では、単純なバイナリ比較が使用されます。つまり、"foo.bár" のようなキーのクエリは、strength パラメーターに設定した値にかかわらず、キー "foo.bar" と一致しません。

戻る

パターンの適用