インデックスは、クエリによってスキャンされたすべてのフィールドがインデックスに含まれている場合にクエリを カバー します。 カバード クエリは、コレクションではなくインデックスをスキャンするため、クエリのパフォーマンスが向上します。
クエリされたフィールドのサブセットがインデックス化されている場合は、インデックスも部分的にクエリをサポートできます。
このタスクについて
単一コレクションには最大64インデックスを含めることができます。 ただし、インデックスが多すぎると、その制限に達する前にパフォーマンスが低下する可能性があります。 書き込みと読み取りの比率が高いコレクションでは、挿入のたびにすべてのインデックスもアップデートする必要があるため、インデックスによってパフォーマンスが低下する可能性があります。
手順
一般的なクエリの特定
アプリケーション内の一般的なクエリ パターンを識別するには、 $queryStats集計ステージを使用します。 $queryStatsは、共有フィールドに基づいてクエリをグループ化するクエリシェイプのメトリクスを報告します。
一般的なクエリをサポートするインデックスを作成する
アプリケーションが頻繁にクエリを実行するフィールドがわかったら、それらのフィールドに対するクエリをサポートするインデックスを作成できます。 詳細については、「 の例 」を参照してください。
インデックスの使用を分析する
アプリケーションでインデックスの使用を開始したら、インデックスの有効性を分析できます。 インデックスの統計と使用状況を確認するには、以下のコマンドを実行します。
$indexStats集計ステージを使用します。MongoDB Atlas配置の場合、 Atlas UIのインデックスを表示 します。
アプリケーションのパフォーマンスを向上させるために、未使用のインデックスを削除することを検討します。 詳細については、「不要なインデックスの削除 」を参照してください。
この手順を定期的に繰り返し、インデックスが現在のワークロードをサポートしていることを確認します。
例
このページの例では、sample_mflixサンプルデータセットのデータを使用します。このデータセットを自己管理型MongoDB配置にロードする方法の詳細については、サンプルデータセットをロードする を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
注意
moviesコレクション内のdocumentには、ここに表示されていない追加フィールドが含まれています。
単一キー インデックスの作成
アプリケーションが 特定のコレクション内の単一のキーに対してのみクエリを実行する場合は、そのコレクションに対して 単一キーインデックスを作成する必要があります。 例、 moviesコレクション内のtitleにインデックスを作成できます。
db.movies.createIndex( { title: 1 } )
このインデックスは次のクエリをサポートします。
db.movies.find( { title: 'Mulholland Drive' } )
複合インデックスの作成
アプリケーションが単一のキーと複数のキーの両方に対してクエリを実行する場合、複合インデックスは単一キーインデックスよりも効率的です。 例、 year 、 runtime 、 titleフィールドにインデックスを作成できます。
db.movies.createIndex( { year: 1, runtime: 1, title: 1 } )
インデックスのプレフィックス
複合インデックスは、インデックス フィールドの開始サブセットであるインデックスプレフィックスに対するクエリをサポートします。例、前述のインデックスは次のクエリをサポートしています。
db.movies.find( { year: 2012, runtime: { $gt: Decimal128( "120" ) } }, { title: 1 } )
インデックスプレフィックスに関する詳細とパフォーマンスに関する考慮事項については、「インデックス プレフィックス 」を参照してください。
$text クエリをサポートするインデックスの作成
MongoDBでホストされているデータの場合、MongoDB Search 検索インデックスを使用した全文検索をサポートできます。詳しくはMongoDB 検索インデックスの作成。をご覧ください。
自己管理型(Atlas 以外)の配置の場合、MongoDB はコレクション内の string コンテンツの検索をサポートするtextインデックス型を提供します。 自己管理型テキストインデックスについて詳しくは、「自己管理型配置のテキストインデックス 」を参照してください。
ベクトル検索インデックスの作成
ベクトル検索インデックスはベクトル埋め込みに対するクエリをサポートします。 ベクトル検索インデックスを作成するには、「 ベクトル検索のインデックスベクトル検索」を参照してください。
インデックスの使用と照合
string の比較にインデックスを使用するには、操作で同じ照合も指定する必要があります。操作でインデックスと異なる照合が指定されている場合、インデックスはインデックス フィールドで string の比較をサポートできません。
警告
照合対応のインデックスキーは、照合のないインデックスのインデックスキーよりも大きくなる可能性があります。これは、照合付きで構成されたインデックスが ICU 照合キーを使用して並べ替え順序を実現するためです。
次のコードを使用して、sample_mflixデータベースの moviesコレクションに、string 比較用の照合ロケール"fr" を持つインデックスを作成します。
db.movies.createIndex( { title: 1 }, { collation: { locale: "fr" } } )
インデックスと同じ照合を指定する次のクエリでは、インデックスを使用できます。
db.movies.find( { title: "Les Misèrables" }, { title: 1, year: 1 } ).collation( { locale: "fr" } )
ただし、デフォルトで「シンプル」な binary コレータを使用する次の クエリ操作、インデックスを使用できず、COLLSCAN が必要です。
db.movies.find( { title: "Les Misèrables" }, { title: 1 , year: 1 } )
インデックス プレフィックスキーが文字列、配列、および埋め込みドキュメントではない複合インデックスの場合でも、異なる照合を指定する操作では、インデックスを使用してインデックス プレフィックスキーの比較をサポートできます。
例、次のコードを使用して、sample_mflixデータベースの moviesコレクションに数値フィールド year と metacritic と stringフィールドtitle を指定する複合インデックスを作成できます。このインデックスでは、string 比較用の照合ロケール"fr" も指定します。
db.movies.createIndex( { year: 1, metacritic: 1, title: 1 }, { collation: { locale: "fr" } } )
文字列の比較に "simple" バイナリ照合を使用する次の操作では、インデックスを使用できます。
db.movies.find( { year: 2012 }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
db.movies.find( { year: 2012, metacritic: { $gt: Decimal128( "50" ) } }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
次の操作では、"simple" バイナリ照合を使用してインデックス付きの title フィールドで文字列を比較しますが、クエリの year: 2012 部分の実行についてはインデックスが使用できます。
db.movies.find( { year: 2012, title: "Les Misèrables" }, { year: 1, title: 1 } )
インデックスでインデックス が使用されているかどうかを確認するには、 explain() オプションを指定してクエリを実行します。
重要
ドキュメントキーとの照合(埋め込みドキュメントのキーを含む)では、単純なバイナリ比較が使用されます。つまり、"type.cafe" のようなキーのクエリは、キー "type.cafe" と一致しません。strength パラメータに設定した値に関係なく、キー "foo.bar" と一致しません。