スカラーインデックス(昇順、降順)に加えて、MongoDBは「ハッシュ」インデックスもサポートしています。フィールドでハッシュインデックスを使用すると、MongoDBはフィールド値のハッシュを計算し、そのハッシュをインデックスに格納します。ハッシュインデックスは、等式比較のみをサポートし、範囲クエリをサポートしません。通常、シャーディングシナリオで使用されます。
MongoDBハッシュ化インデックスの作成
次の構文を使用して、ハッシュ化されたインデックスを作成できます。
db.collection.ensureIndex({'field':'hashed'});
同じフィールドにスカラーインデックスとハッシュインデックスの両方を作成できます。
MongoDBシャーディング
通常、MongoDBシャーディングは、「範囲ベース」のパーティショニングを使用して実装されます。このアプローチでは、各シャードにシャードキーの値の範囲が割り当てられます。シャードキーがタイムスタンプやobjectIDのように単調に増加している場合、最新の値が常に同じシャードにルーティングされるため、「ホット」シャードになることがあります。
これを回避する方法は、「ハッシュベースのパーティショニング」を使用することです。シャードキーのハッシュが計算され、このハッシュ値が実際の値の代わりにシャードにルーティングするために使用されます。これにより、すべての最新データを同じシャードに送信するのではなく、すべてのシャードに負荷を均等に分散できます。ハッシュベースのパーティショニングは、シャードキーのハッシュインデックスを使用して実装されます。詳細については、シャーディングのドキュメントを参照してください。
ハッシュインデックスの長所と短所
-
長所
ハッシュインデックスは、完全なキーではなくキーのハッシュのみが保存されるため、スカラーインデックスよりも小さくなる傾向があります。例えば。 10万件のドキュメントを使用した簡単なテストでは、文字列フィールド「fieldName」にハッシュインデックスとスカラーインデックスを追加しました。以下に示すように、ハッシュインデックスはスカラーインデックスよりもかなり小さくなる傾向があります。
"indexSizes" : { "_id_" : 811008, "firstName_1" : 4415488, "firstName_hashed" : 1490944 }
-
短所
範囲クエリはサポートしていません。ハッシュ化されたインデックスに対して範囲クエリを実行すると、インデックスがスキャンされます。
ハッシュインデックスの制約
- ハッシュインデックスは配列をサポートしていません。
- ハッシュインデックスを複合インデックスにすることはできません。
- ハッシュインデックスに一意の制約を追加することはできません。