View a markdown version of this page

3 つ以上の属性を持つ複合インデックス - Amazon DocumentDB

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

3 つ以上の属性を持つ複合インデックス

概要

複合インデックスまたは複合インデックスは、単一のインデックス構造内の複数のフィールドへの参照を維持します。これらのインデックスは、複数のフィールドを同時にフィルタリングするか、フィルタリングとソート操作を組み合わせるクエリのパフォーマンスを最適化します。また、左端のインデックス付きフィールドに対する単一条件クエリにも有効です。データベースは、これらのインデックスエントリを活用して、完全なコレクションスキャンを実行せずに、一致するドキュメントを効率的に見つけます。

Amazon DocumentDB は、複合インデックスを使用して、インデックスプレフィックスと呼ばれる概念であるインデックス付きフィールドの先行サブセットを含むクエリをサポートできます。たとえば、 に複合インデックスがある場合{state: 1, city: 1, zipcode: 1}、Amazon DocumentDB はフィールド「state」のみ、フィールド「state」と「city」を一緒に使用するクエリ、または 3 つのフィールド「state」、「city」、「zipcode」をすべて効率的に処理できます。ただし、クエリでは、その間のフィールドをスキップすることなく、左から右のフィールドを使用する必要があります。つまり、フィールド「city」または「zipcode」のみを使用するクエリ、または「state」や「zipcode」などの組み合わせ (「city」のスキップ) を使用するクエリは、インデックスを完全に利用することはできません。

ほとんどの実世界のシナリオでは、3 つ以下の属性を持つ複合インデックスは通常、最適なパフォーマンスとリソース効率を実現します。複合インデックスに 3 つ以上の属性を含めることは可能ですが、多くの場合、リソースの消費量が増加し、利点を上回ります。

クラスターへの影響

クエリのすべての条件をカバーするインデックスを作成して理論上のパフォーマンスを最大限に高めようとしていますが、ほとんどのデータフィルタリングは複合インデックスの最初の 1~3 個の属性を通じて行われます。このしきい値を超える追加のフィールドは、意味のあるクエリの最適化ではなく、主にインデックスサイズに影響します。

ストレージと I/O オーバーヘッド: 多くの属性を持つ複合インデックスは、よりシンプルな代替手段よりもはるかに多くのストレージ領域を消費します。サイズは、インデックス付き属性の数と、インデックス付き値自体のサイズに直接比例します。

メモリフットプリント: 多くの属性を持つ複合インデックスの大きなストレージフットプリントは、対応するメモリフットプリントを作成し、ワーキングセットを大きくして、頻繁にアクセスされる他のデータをバッファプールから置き換えます。

書き込みオペレーション: 複数のインデックス付きフィールドに影響するドキュメントの変更ごとに、複合インデックスエントリ全体を更新し、書き込みオペレーションの完了に必要な作業を乗算する必要があります。

識別方法

まず、コレクション内のすべてのインデックスを確認して、3 つ以上の属性を持つ複合インデックスを特定します。

// List all indexes for the collection db.collection.getIndexes() // Look for indexes with 3+ fields like: // { "userId": 1, "status": 1, "category": 1, "priority": 1, "region": 1 } // { "orderId": 1, "customerId": 1, "productId": 1, "timestamp": 1, "warehouse": 1 }

修正

3 つ以上の属性を持つ複合インデックスが使用されている場合は、それを利用するクエリを特定し、最適化の機会を探します。これらのインデックスを、3 つ以下の属性を含むより効率的なインデックスに置き換えることを検討してください。新しいインデックスを実装したら、3 つ以上の属性を含む古いインデックスを削除します。

注記

インデックスを削除する前に、常に利害関係者と調整し、パフォーマンスへの影響を検証してください。

複合インデックスを作成するときは、等価、ソート、範囲 (ESR) ルールに従います。

等価ソート範囲 (ESR) ルール: この順序は、最初に等価条件でデータセットをフィルタリングし、次に縮小されたセットにソートオペレーションを適用し、最後に可能な限り小さいサブセットで範囲スキャンを実行することで、インデックス効率を最大化します。

  • フィールドを等号 (完全一致) として並べ替え、

  • ソート (順序付け)、

  • 範囲 (>、<、$in)。

// Query pattern db.orders.find({ userId: "user123", // Equality price: { $gte: 50, $lte: 200 } // Range }).sort({ createdAt: -1 }) // Sort // Optimal index following ESR rule db.orders.createIndex({ userId: 1, createdAt: -1, price: 1 }) // Equality Sort Range