ハッシュ インデックスの作成
すでにデータが含まれているコレクションでシャーディングを有効にするには、 シャードキー をサポートする インデックスを作成する 必要があります。 空のコレクションでシャーディングを有効にするには、代わりにがコレクションをシャードするときに シャードキー インデックス を指定します。
ハッシュされたインデックスはハッシュされたシャーディングをサポートし、シャードキー値のハッシュに基づいてシャード全体にデータが分散されます。
単一フィールド ハッシュ インデックスを作成するには、インデックス キーの値として hashed
を指定します。
db.<collection>.createIndex( { <field>: "hashed" } )
複数のフィールドを含むハッシュ インデックス(複合ハッシュ インデックス)を作成するには、単一のインデックス キーの値としてhashed
を指定します。 その他のインデックス キーの場合は、並べ替え順序( 1
または-1
)を指定します。
db.<collection>.createIndex( { <field1>: "hashed", <field2>: "<sort order>", <field3>: "<sort order>", ... } )
このタスクについて
ハッシュされたインデックは、ObjectId 値やタイムスタンプのように単調に変化するフィールドを持つシャードキーに最適です。単調に増加するシャードキー値を使用して範囲シャーディングを使用すると、上限が MaxKey
のチャンクに着信書き込みの大部分が集中します。この動作により、挿入操作が 1 つのシャードに限定され、シャーディングされたクラスターでの分散書込みの利点がなくなります。
アプリケーションに最適なシャーディング方法を選択する方法の詳細については、ハッシュされたシャーディングと範囲のあるシャーディングを参照してください。
ハッシュされたシャードキーの選択
ハッシュされたシャードキーについて、次のガイドラインを考慮してください。
ハッシュされたシャードキーに選択するフィールドには、濃度が高く、異なる値が多数含まれている必要があります。
データモデルに濃度の高い単一フィールドが含まれていない場合は、 ハッシュされた複合インデックスの作成を検討してください。 ハッシュされた複合インデックスを使用すると、より一意のインデックス値が提供され、濃度を高めることができます。
シャードキーは一般的なクエリ パターンをサポートする必要があります。 範囲クエリ(
$gt
や$lt
など)では、ハッシュされたインデックスを使用できません。 アプリケーションがシャードキーに含まれるフィールドに対して範囲クエリを頻繁に実行する場合は、範囲ベースのシャーディングを検討してください。
ハッシュされたインデックスには最大32フィールドを含めることができます。
始める前に
ハッシュされたシャーディングを実装するには、 シャーディングされたクラスター を配置する必要があります。
例
次の例は、次の方法を示しています。
単一フィールド ハッシュ インデックスの作成
すでにデータを含むorders
コレクションについて考えてみましょう。 orders
コレクションに_id
フィールドのハッシュ インデックスを作成します。
db.orders.createIndex( { _id: "hashed" } )
_id
フィールドは単調に増加するため、ハッシュされたインデックス キーの適切な候補になります。 _id
の値は段階的に増加しますが、MongoDB が個々の_id
値のハッシュを生成する場合、それらのハッシュされた値が同じチャンクにある可能性は低くなります。
インデックスを作成したら、 orders
コレクションをシャーディングできます。
sh.shardCollection( "<database>.orders", { _id: "hashed" } )
ハッシュされた複合インデックスの作成
すでにデータを含むcustomers
コレクションについて考えてみましょう。 次のとおり、 name
、 address
、 birthday
フィールドのcustomers
コレクションにハッシュされた複合インデックスを作成します。
db.customers.createIndex( { "name" : 1 "address" : "hashed", "birthday" : -1 } )
ハッシュされた複合インデックスを作成する場合は、単一のインデックス キーの値としてhashed
を指定する必要があります。 その他のインデックス キーの場合は、並べ替え順序( 1
または-1
)を指定します。 前のインデックスでは、 address
は ハッシュされたフィールドです。
インデックスを作成したら、 customers
コレクションをシャーディングできます。
sh.shardCollection( "<database>.customers", { "name" : 1 "address" : "hashed", "birthday" : -1 } )