このクエリには複数のインデックスが必要になります。そのことに疑いの余地はありません。
問題は、どのインデックスですか?
$or
ここで、MongoDB クエリ オプティマイザーのバグにより、インデックスを使用して最適な方法でデータをカーディナルに並べ替えることができないことを考慮する必要があります: https://jira.mongodb.org/browse/SERVER- 1205年。
$or
したがって、ソートでパフォーマンスの問題が発生し、ソート フィールドを$or
句のインデックスに配置しても役に立たないことがわかります。
したがって、これを考慮して、最初に必要なインデックスは、作成している基本クエリをカバーするものです。@Leonidが言ったように、これを複合インデックスにすることができますが、彼が行った順序では行いません。代わりに、次のようにします。
db.col.ensureIndex({type:-1,deleted:-1,date.created:-1})
deleted
選択性が非常に低いため、フィールドがインデックスに含まれているかどうかはまったくわかりません。実際には、パフォーマンスの低い操作を作成する可能性があります (これは SQL を含むほとんどのデータベースに当てはまります)。この部分は、ユーザーによるテストが必要です。たぶん、フィールドは最後にする必要があります(?)。
インデックスの順序については、やはり推測です。並べ替えが DESC であるため、すべてのフィールドに DESC を指定しましたが、explain
ここでは自分でこれを行う必要があります。
したがって、クエリのマスター句を処理できるはずです。次に、それらの s に対処し$or
ます。
それぞれ$or
が個別にインデックスを使用し、MongoDB クエリ オプティマイザーはそれらが完全に個別のクエリであるかのように個別にインデックスを検索します。 /manual/core/indexes/#compound-indexes ) は、それらがプレフィックスで機能することです (ここでのメモの例: http://docs.mongodb.org/manual/core/indexes/#id5 )。したがって、作成することはできません3 つの句すべてをカバーする単一の複合インデックスであるため、$or
(上記のバグを考慮して) でインデックスを宣言するより最適な方法は次のとおりです。
db.col.ensureindex({creator._id:1});
db.col.ensureindex({aprent._id:1});
db.col.ensureindex({somrelation._id:1});
クエリに最適なインデックスの作成を開始できるはずです。
ただし、これは自分でテストする必要があることを強調しておきます。