3つのフィールドを持つ架空のドキュメントを想定します。
- _id:ObjectId
- emailAddress:文字列
- アカウント:文字列
ここで、emailAddress ANDアカウントに関するクエリを指定すると、次の2つのインデックスのどちらがパフォーマンスが向上しますか。
- emailAddressのみの一意のインデックス(一意のフィールドであると想定)
- アカウントとemailAddressの複合インデックス
3つのフィールドを持つ架空のドキュメントを想定します。
ここで、emailAddress ANDアカウントに関するクエリを指定すると、次の2つのインデックスのどちらがパフォーマンスが向上しますか。
パフォーマンスの面では、違いはせいぜい小さいでしょう。電子メールアドレスは一意であるため、電子メールフィールドを持つ複合インデックスは、電子メールアドレスのみのインデックスよりも役立つことはありません。この理由は、電子メールフィールドにはすでにコレクションの最大カーディナリティがあり、それ以上のインデックスフィールドは、電子メールフィールドだけで常に正しいドキュメントに到達するため、データベースがレコードをより迅速にフィルタリングするのに役立ちません。
メモリ使用量(MongoDBのようなデータベースにとって非常に重要です)に関しては、電子メールインデックスだけでもはるかに小さくなります。
TL; DR:電子メールアドレスのインデックスのみを使用します。
インデックスに関しては、目標は、可能な限り最高のカーディナリティ(または「選択性」)を備えた単一のインデックスを作成することです。クエリごとに1つの(複合)インデックスを使用するクエリを作成してみてください。一意のインデックスには最大のカーディナリティがあります。選択性の低いフィールドで一意のインデックスを合成しても、その最大値をさらに増やすことはできません。インデックスを追加すると、find()、update()、およびremove()クエリの速度が低下します。ですから、「無駄のない、意地悪な」ことです。
ただし、メールフィールドでfind()を実行しているときに、アカウントフィールドでsort()を使用している場合は、複合インデックスを使用する必要があります。
複数のキーでクエリを実行し、結果を並べ替えるのが一般的です。このような状況では、複合インデックスが最適です。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ
よく考えてください!別のフィールドでデータを並べ替える必要がある場合は、通常、複合インデックスが必要です。