1

abの2 つのフィールドがあり、ここでbはaよりもかなり高い選択性を持っています。

ここで、 abの両方に対してのみクエリを実行する場合(どちらか一方のフィールドを単独でクエリすることはありません)、次の 2 つのインデックスのどちらが優れているか、またその理由は次のとおりです。

  1. {a: 1, b : 1}
  2. {b: 1, a : 1}

Explain はほぼ同じ結果を返すようですが、選択性の高いフィールドを最初に配置する必要があることをどこかで読みました。なぜそれが理にかなっているのかわからない。

4

3 に答える 3

4

150,000,000 件のレコード データベースに対するクエリを改善するために大規模な作業を行った結果、次のことがわかりました。

必ずしもより高い選択性のフィールドではありませんが、実際には一致するのが「より速い」フィールドであり、最初の位置に移動するとパフォーマンスが大幅に向上する可能性があります

次のフィールドで構成されるインデックスがありました。

郵便番号、住所、都市、名、姓

アドレスは string = string ではなく配列で照合されるため、実行に最も時間がかかり、照合が最も遅くなります。私が最初に作成したインデックスは、address_zip_city_last_name_first_nameで、DB 全体に対して 1000 レコードを照合する実行時間は数時間かかりました。

住所フィールドは実際にはこれらの中で最も選択度が高いと思われますが、単純な文字列の等価性によって照合されていないため、最も時間がかかります。それは実際にはこのようなものになります

{ address: {$all : ["1233", "main", "avenue] }}

このインデックスを最初に「より高速な」フィールドを持つように変更すると、たとえば次のようになります。同じ 1000 件のレコードが、何時間もかかるのではなく、わずか 1 秒で一致します。

これが誰かを助けることを願っています

乾杯

于 2015-02-16T00:16:26.223 に答える
1

さらに分析を行った結果、パフォーマンスの観点からは、2 つのインデックスは実際にはほぼ同じです。

実際に同様の状況にある場合、実際に考慮すべきことは、将来 a のみまたは b のみでクエリを実行し、そのフィールドをインデックスの最初に配置する可能性が高いかどうです

于 2012-10-20T15:23:46.570 に答える
0

ヒントを提供することはできますが、オプティマイザーが使用するのに最適なインデックスを選択すると思います

例えば

db.collection.find({user:u, foo:d}).hint({user:1});

http://www.mongodb.org/display/DOCS/Optimizationを参照してください

于 2012-10-15T18:33:33.817 に答える