9

3つのフィールドを持つ架空のドキュメントを想定します。

  1. _id:ObjectId
  2. emailAddress:文字列
  3. アカウント:文字列

ここで、emailAddress ANDアカウントに関するクエリを指定すると、次の2つのインデックスのどちらがパフォーマンスが向上しますか。

  1. emailAddressのみの一意のインデックス(一意のフィールドであると想定)
  2. アカウントとemailAddressの複合インデックス
4

2 に答える 2

18

パフォーマンスの面では、違いはせいぜい小さいでしょう。電子メールアドレスは一意であるため、電子メールフィールドを持つ複合インデックスは、電子メールアドレスのみのインデックスよりも役立つことはありません。この理由は、電子メールフィールドにはすでにコレクションの最大カーディナリティがあり、それ以上のインデックスフィールドは、電子メールフィールドだけで常に正しいドキュメントに到達するため、データベースがレコードをより迅速にフィルタリングするのに役立ちません。

メモリ使用量(MongoDBのようなデータベースにとって非常に重要です)に関しては、電子メールインデックスだけでもはるかに小さくなります。

TL; DR:電子メールアドレスのインデックスのみを使用します。

于 2012-03-07T10:19:06.097 に答える
4

インデックスに関しては、目標は、可能な限り最高のカーディナリティ(または「選択性」)を備えた単一のインデックスを作成することです。クエリごとに1つの(複合)インデックスを使用するクエリを作成してみてください。一意のインデックスには最大のカーディナリティがあります。選択性の低いフィールドで一意のインデックスを合成しても、その最大値をさらに増やすことはできません。インデックスを追加すると、find()、update()、およびremove()クエリの速度が低下します。ですから、「無駄のない、意地悪な」ことです。

ただし、メールフィールドでfind()を実行しているときに、アカウントフィールドでsort()を使用している場合は、複合インデックスを使用する必要があります。

複数のキーでクエリを実行し、結果を並べ替えるのが一般的です。このような状況では、複合インデックスが最適です。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ

よく考えてください!別のフィールドでデータを並べ替える必要がある場合は、通常、複合インデックスが必要です。

于 2012-08-09T19:10:42.530 に答える