2017-11-24 1 views
1

私はデータベースを検索したいときにCouchdbでマンゴークエリを使用します。ドキュメント内の複数のフィールドで検索できます。Couchdb、Mangoのクエリとインデックス

簡単にするために、3つのフィールドすべてを検索してドキュメントを見つけることができるドキュメントがあります。

クエリのマンゴーインデックスを作成する際には、どのフィールドを使用する必要がありますか?複数のフィールドを作成してインデックスを作成する必要がありますか?秩序は重要か?

フィールドには、3つの異なる文書タイプ(A、B C)が定義されています。私は1つだけを検索する必要があります、他のタイプをインデックスから除外してより速くすることは可能ですか?

Field_Type: A 

興味のあるドキュメントのみを検索するために、ビューに対してインデックスを実行することができます。これは可能ですか?

例インデックス使用かどうクエリでわからない

{ 
     "index": { 
      "fields": [ 
      "FieldOne" 
      ] 
     }, 
     "name": "foo-json-index", 
     "type": "json" 
    } 

複数のインデックスを、表示されることが知られているフィールドに

一つの指標?クエリを構築するときに正しいものを選択する

{ 
     "index": { 
      "fields": [ 
      "FieldOne", 
      "FieldTwo", 
      "FieldThree" 
      ] 
     }, 
     "name": "foo-json-index", 
     "type": "json" 
    } 

それとも複数のインデックス?

これは、最速の検索結果を得るための正しいアプローチですか?

+0

最適化しようとしているクエリセレクタの例がありますか。複数のフィールドにわたる任意のクエリをカバーするインデックスを提案するのは難しいですが、最適化する特定のクエリがあれば、私はアドバイスすることができます。 –

+0

クエリーは複数のフィールドにわたって非常に可変であり、バックオフィスのスタッフが使用するので、すべてで検索したいと思うように簡単に最適化することはできません。あなたの提案に感謝し、私の頭の中で多くの質問をクリアした答え。 @WillHolley –

答えて

3

一般的なケースでは簡単には解決できないと思います。最適化するためには、特定のセレクタ(またはセレクタセット)が必要です。しかし、助けてインデックスを作成する際に考慮すべき3つの側面があります:あなたはマンゴーのインデックスを作成するとき

  1. は、インデックス付きフィールドのすべてを含む文書だけがインデックスに含まれています。 3つのフィールドをすべて含む2番目のインデックスの例は、クエリセレクタ内の3つのフィールドをすべて常に指定する限り、完璧です。

  2. インデックスでは、セレクタに従ってすべてのインデックスフィールドが存在する必要がある場合にのみ、インデックスを使用できます。たとえば、インデックスにフィールドAとBが含まれていてもAのみをクエリする場合は、Aは含まれていてBは含まれていないドキュメントが含まれないため、インデックスを使用できません。

  3. インデックスのフィールド順問題。インデックスは、_viewの複合キーと同じ、インデックス付きフィールドの値の連続した範囲を見つけることができる場合にのみ使用できます。たとえば、フィールドAとB、および文書[{A:1,B:1},{A:1,B:2},{A:2,B:1},{A:2,B:2}]に索引があるとします。インデックスは、[[1,1],[1,2],[2,1],[2,2]]のようになります。クエリがA > 1 AND B == 2の場合、一致するドキュメント([1,2]および[2,2])はすべての一致するドキュメントをカバーする唯一の範囲は[1,2],[2,1],[2,2]]です。値[2,1]はメモリ内にフィルタリングする必要があります。

あなたは_explainエンドポイントを使用してクエリを満たすために使用されているもののインデックスを参照することができ、そしてそれはあなたのインデックスが指定されたセレクタのためにもすることができますどのように選択するなど、いくつかの手がかりを与える必要があります。

関連する問題