レッドサンドロ、
Index Cardinality
を考慮する必要があります およびSelectivity
。
1。インデックスカーディナリティ
インデックスカーディナリティは、フィールドに可能な値がいくつあるかを示します。フィールドsex
可能な値は2つだけです。カーディナリティが非常に低い 。 names, usernames, phone numbers, emails
などの他のフィールド などは、コレクション内のすべてのドキュメントに対してより一意の値を持ち、高いカーディナリティと見なされます。 。
-
カーディナリティの向上
フィールドのカーディナリティが大きいほど、インデックスは検索スペースを狭め、セットがはるかに小さくなるため、インデックスが役立ちます。
sex
にインデックスがある場合 そしてあなたはジョンという名前の男性を探しています。sex
でインデックスを作成した場合、結果スペースを約%50だけ絞り込むことができます。 最初。逆に、name
でインデックスを作成した場合 、すぐに結果セットをJohnという名前のユーザーのごく一部に絞り込み、次にそれらのドキュメントを参照して性別を確認します。 -
経験則
high-cardinality
でインデックスを作成してみてください キーを押すか、high-cardinality
を入力します 複合インデックスの最初のキー。詳細については、本の複合インデックスに関するセクションを参照してください。MongoDBの決定的なガイド
2。選択性
また、インデックスを選択的に使用し、インデックス付きフィールドで可能なドキュメントの数を制限するクエリを作成する必要があります。簡単にするために、次のコレクションを検討してください。インデックスが{name:1}
の場合 、クエリを実行した場合{ name: "John", sex: "male"}
。 1
をスキャンする必要があります 資料。 MongoDBを選択的にすることを許可したからです。
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
次のコレクションについて考えてみます。インデックスが{sex:1}
の場合 、クエリ{sex: "male", name: "John"}
を実行すると 。 4
をスキャンする必要があります ドキュメント。
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
より大きなデータセットで考えられる違いを想像してみてください。
複合インデックスの簡単な説明
複合インデックスについて間違った仮定をするのは簡単です。複合インデックスに関するMongoDBのドキュメントによると。
MongoDBは、複合インデックスをサポートします。単一のインデックス構造 複数のフィールドへの参照を保持します コレクションのドキュメント内。次の図は、2つのフィールドの複合インデックスの例を示しています。
複合インデックスを作成する場合、1インデックス 複数のフィールドを保持します。したがって、コレクションに{"sex" : 1, "name" : 1}
でインデックスを付けると 、インデックスはおおよそ次のようになります:
["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103
コレクションを{"name" : 1, "sex" : 1}
でインデックス付けすると 、インデックスはおおよそ次のようになります:
["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103
{name:1}
がある プレフィックスは、複合インデックスを使用する際にはるかに役立ちます。このトピックについて読むことができるものはもっとたくさんあります。これがある程度の明確さを提供できることを願っています。