Docs Menu
Docs Home
/
データベース マニュアル
/ / /

ハッシュ インデックスの作成

項目一覧

  • このタスクについて
  • ハッシュされたシャードキーの選択
  • 始める前に
  • 単一フィールド ハッシュ インデックスの作成
  • ハッシュされた複合インデックスの作成
  • 詳細

すでにデータが含まれているコレクションでシャーディングを有効にするには、 シャードキー をサポートする インデックスを作成する 必要があります。 空のコレクションでシャーディングを有効にするには、代わりにがコレクションをシャードするときに シャードキー インデックス を指定します。

ハッシュされたインデックスはハッシュされたシャーディングをサポートし、シャードキー値のハッシュに基づいてシャード全体にデータが分散されます。

単一フィールド ハッシュ インデックスを作成するには、インデックス キーの値として 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コレクションについて考えてみましょう。 次のとおり、 nameaddressbirthdayフィールドの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
}
)

戻る

ハッシュ