クエリをサポートするインデックスの作成
インデックスは、クエリによってスキャンされたすべてのフィールドがインデックスに含まれている場合にクエリを カバー します。 カバード クエリは、コレクションではなくインデックスをスキャンするため、クエリのパフォーマンスが向上します。
クエリされたフィールドのサブセットがインデックス化されている場合は、インデックスも部分的にクエリをサポートできます。
このタスクについて
単一コレクションには最大64インデックスを含めることができます。 ただし、インデックスが多すぎると、その制限に達する前にパフォーマンスが低下する可能性があります。 書き込みと読み取りの比率が高いコレクションでは、挿入のたびにすべてのインデックスもアップデートする必要があるため、インデックスによってパフォーマンスが低下する可能性があります。
手順
一般的なクエリの特定
アプリケーション内の一般的なクエリ パターンを識別するには、 $queryStats
集計ステージを使用します。 $queryStats
は、共有フィールドに基づいてクエリをグループ化するクエリシェイプのメトリクスを報告します。
一般的なクエリをサポートするインデックスを作成する
アプリケーションが頻繁にクエリを実行するフィールドがわかったら、それらのフィールドに対するクエリをサポートするインデックスを作成できます。 詳細については、「 の例 」を参照してください。
インデックスの使用を分析する
アプリケーションでインデックスの使用を開始したら、インデックスの有効性を分析できます。 インデックスの統計と使用状況を確認するには、以下のコマンドを実行します。
$indexStats
集計ステージを使用します。MongoDB Atlas配置の場合、 Atlas UIのインデックスを表示 します。
アプリケーションのパフォーマンスを向上させるために、未使用のインデックスを削除することを検討します。 詳細については、「不要なインデックスの削除 」を参照してください。
この手順を定期的に繰り返し、インデックスが現在のワークロードをサポートしていることを確認します。
例
単一キー インデックスの作成
アプリケーションが 特定のコレクション内の単一のキーに対してのみクエリを実行する場合は、そのコレクションに対して 単一キーインデックスを作成する必要があります。 例、 product
コレクション内のcategory
にインデックスを作成できます。
db.products.createIndex( { category: 1 } )
上記のインデックスはこのクエリをサポートします。
db.products.find( { category: "electronics" } )
複合インデックスの作成
アプリケーションが単一のキーと複数のキーの両方に対してクエリを実行する場合、複合インデックスは単一キーインデックスよりも効率的です。 例、 category
、 item
、 location
フィールドにインデックスを作成できます。
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
コレクションには、数値フィールドの score
、price
、および 文字列フィールドの 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" と一致しません。