単純な MongoDB クエリを作成するときに、クエリ内の条件の順序について質問があります。たとえば、(Mongoose.js 構文):
conditions = { archived: false, first_name: "Billy" };
対。
conditions = { first_name: "Billy", archived: false };
..単純な find() 関数で:
User.find(conditions, function(err, users) { <some logic> });
..単純な単一キーのインデックス作成戦略を想定すると、次のようになります。
UserSchema.index( { first_name: 1, archived: 1} );
..上記の条件の順序は重要ですか?
重要:複合インデックスの順序が重要であることは知っていますが、上記のとおり、単一キー インデックス クエリに興味があります。私たちがここにいるので、完全に索引付けされていないクエリのケースにも興味があります。:)
ALTERNATE EXPLANATION:別の言い方をUser
すれば、2 つの可能な内部 MongoDB 検索戦略を考えると、100 秒 (50 がアーカイブされ、50 がアーカイブされていない) と仮定します。
- 最初に 50 人の
archived
ユーザーすべてをフィルターで除外し、残りの 50 人のアーカイブされていないユーザーをfirst_name
「Billy」という値で検索します。 - 最初に 100 個の
User
ドキュメントすべてからfirst_name
値 "Billy" を検索し、アーカイブされた Billy をすべて削除して、見つかったオブジェクトをフィルタリングします。
..#1の方が高速であると想定します(2つ以上の条件を持つ大規模なクエリでは、潜在的にはるかに高速です)。しかし、どちらが速いか、その理由に関係なく、確かにそのうちの 1 つです。
中心的な質問:複合インデックスの広大で強力な世界の外で、MongoDB は、どのフィールドとどの順序に関係なく、最もパフォーマンスが高く高速な検索/フィルターを自動的に実行する方法を知っていますか? それとも、システムにプログラム的に (提示された条件の順序などを介して) 何が最適かを伝える必要がありますか?