ハッシュされたインデックス
ハッシュされたインデックスは、インデックス フィールドの値のハッシュを収集して保存します。
ハッシュされたインデックスは、ハッシュされたシャードキーを使用したシャーディングをサポートします。 ハッシュベースのシャーディングでは、フィールドのハッシュされたインデックスをシャードキーとして使用し、シャーディングされたクラスター全体でデータをパーティション分割します。
ユースケース
ハッシュされたインデックは、 ObjectId 値やタイムスタンプのように 単調 に 変化するフィールドを持つシャードキーに最適です。単調に増加するシャードキー値を使用して範囲シャーディングを使用すると、上限が MaxKey
のチャンクに着信書き込みの大部分が集中します。 この動作により、挿入操作が 1 つのシャードに限定され、シャーディングされたクラスターでの分散書込みの利点がなくなります。
アプリケーションに最適なシャーディング方法を選択する方法の詳細については、ハッシュされたシャーディングと範囲のあるシャーディングを参照してください。
動作
浮動小数点数
ハッシュ インデックスにより、浮動小数点数は 64 ビット整数に切り捨てられた後、ハッシュ化されます。たとえば、ハッシュ インデックスでは、2.3
、2.2
、2.9
の値の格納に同じハッシュが使用されます。このように、複数の値が同じハッシュキーに割り当てられることを、コリジョン(collision)と呼びます。コリジョンにより、クエリのパフォーマンスに悪影響が及ぶことがあります。
衝突を防ぐため、64 ビット整数に確実に変換できず、その後浮動小数点に戻すことができない浮動小数点数にはハッシュされたインデックスを使用しないでください。
ハッシュされたインデックスは 2 53 より大きい浮動小数点数をサポートしません。
制限
ハッシュされたインデックスには、配列フィールドとユニークなプロパティに対する制限があります。
配列フィールド
ハッシュ関数は 複数キー インデックス をサポートしていません。配列を含むフィールドでハッシュされたインデックスを作成したり、またはハッシュされたインデックス フィールドに配列を挿入したりすることはできません。
ユニーク制約
ハッシュされたインデックスに ユニーク制約 を指定することはできません。代わりに、ユニーク制約を持つハッシュされていないインデックスを追加で作成できます。MongoDB はハッシュされていないインデックスを使用して、選択したフィールドの一意性を強制できます。
はじめる
ハッシュ インデックスを作成するには、「ハッシュされたインデックスを作成する」を参照してください。
詳細
このセクションでは、ハッシュ インデックスの技術的な詳細について説明します。
ハッシュ関数
重要
MongoDB では、ハッシュインデックスを使用してクエリを解決する際に、ハッシュ関数を使用して自動的にハッシュ値を計算します。アプリケーションでハッシュを計算する必要はありません。
キーのハッシュ値を確認するには、convertShardKeyToHashed()
メソッドを使用します。このメソッドは、ハッシュ インデックスと同じハッシュ関数を使用します。
埋め込みドキュメント
ハッシュ関数により、埋め込みドキュメントをまとめて、値全体のハッシュを計算できます。