クエリをサポートするインデックスの作成
項目一覧
インデックスは、クエリによってスキャンされたすべてのフィールドがインデックスに含まれている場合にクエリをサポートします。クエリはコレクションではなくインデックスをスキャンします。クエリをサポートするインデックスを作成すると、クエリのパフォーマンスが大幅に向上します。
このドキュメントでは、クエリをサポートするインデックスを作成するための戦略について説明します。
すべてのクエリが同じ単一のキーを使用する場合は、単一キーインデックスを作成する
特定のコレクション内の単一のキーに対してのみクエリを実行する場合は、そのコレクションに対して単一キー インデックスを 1 つだけ作成する必要があります。たとえば、product
コレクションの category
にインデックスを作成できます。
db.products.createIndex( { "category": 1 } )
複数の異なるクエリをサポートする複合インデックスを作成する
時には 1 つのキーのみでクエリを実行し、時にはそのキーと 2 番目のキーを組み合わせてクエリを実行する場合、単一キー インデックスを作成するよりも複合インデックスを作成する方が効率的です。MongoDB は両方のクエリに複合インデックスを使用します。たとえば、category
と item
の両方にインデックスを作成できます。
db.products.createIndex( { "category": 1, "item": 1 } )
これにより、両方のオプションが可能になります。 category
のみをクエリすることも、 category
とitem
を組み合わせてクエリすることもできます。 複数のフィールドの 1 つの 複合インデックスで、それらのフィールドの " プレフィックス " サブセットを検索するすべてのクエリをサポートできます。
例
コレクションの次のインデックス:
{ x: 1, y: 1, z: 1 }
次のインデックスがサポートするクエリをサポートできます。
{ x: 1 } { x: 1, y: 1 }
プレフィックス インデックスの方がクエリ パフォーマンスが向上する場合があります。たとえば、z
が大きな配列である場合などです。
{ x: 1, y: 1, z: 1 }
インデックスは、次のインデックスと同じクエリの多くをサポートすることもできます。
{ x: 1, z: 1 }
また、{ x: 1, z: 1 }
には追加の用途があります。次のインデックスが与えられている場合。
db.collection.find( { x: 5 } ).sort( { z: 1} )
{ x: 1, z: 1 }
インデックスはクエリとソート操作の両方をサポートしますが、{ x: 1, y: 1, z: 1 }
インデックスはクエリのみをサポートします。並べ替えについて詳しくは、「インデックスを使用してクエリ結果を並べ替える」を参照してください。
バージョン 2.6 以降では、MongoDB はインデックスの交差を使用してクエリを実行できます。 クエリをサポートする複合インデックスを作成するか、インデックスの交差に依存するかは、システムの仕様によって異なります。 詳細については、「インデックスの交差と複合インデックス」を参照してください。
テキスト検索をサポートするインデックスを作成する
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" と一致しません。