sql >> データベース >  >> NoSQL >> MongoDB

複合インデックスの順序は、パフォーマンスの観点からMongoDBでどのように重要ですか?

    レッドサンドロ、

    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}がある プレフィックスは、複合インデックスを使用する際にはるかに役立ちます。このトピックについて読むことができるものはもっとたくさんあります。これがある程度の明確さを提供できることを願っています。



    1. nodejsとredis-nodeを使用した非同期プログラミングパラダイム

    2. Laravel5.5を使用したPredisAggregate/RedisCluster.php:337のプールで利用可能な接続がありません

    3. nestjs redisマイクロサービスの使用方法は?

    4. mongoに認証できません、認証は失敗します