ObjectIdを一意のキーとして使用するとシャーディングが簡単になることを読み続けていますが、それがなぜであるかについての比較的詳細な説明は見ていません。誰かがこれに光を当てることができますか?
私が尋ねる理由は、英語の文字列(明らかに一意になります)を一意のキーとして使用したいのですが、後でそれが私の手を縛らないようにしたいからです。
私は最近mongoDBに慣れてきたので、これを一粒の塩で理解してください。ただし、ObjectIdの一部がどのキー値を示すかという事実のために、ObjectIdを使用する場合は、独自のキー値よりもシャーディングの方がおそらく効率的であると思われます。ドキュメントが作成されたマシンまたはシャード。mongoドキュメントのこのページの下部には、ObjectIdの各部分の意味が説明されています。
Mongo ユーザー リストでこの質問をしたところ、基本的には、_id の独自の値を生成しても問題なく、シャーディングが難しくなることはないとの回答がありました。私にとっては、URL で数値を使用する場合のように、_id に数値が必要な場合があるため、一部のコレクションで独自の _id を生成しています。
シャード キーは一意である必要はありません。オブジェクト ID に基づくコレクションのシャーディングが常に効率的であると結論付けることはできません。
実際、ObjectID はおそらくシャード キーとしては適していません。
ドキュメントから ( http://docs.mongodb.org/manual/core/sharded-cluster-internals/「書き込みスケーリング」のセクション):
「[T] [ObjectID] の最上位ビットはタイム スタンプを表します。これは、規則的で予測可能なパターンで増加することを意味します。[したがって] すべての挿入操作は、データを単一のチャンクに格納するため、単一のチャンクに格納されます。結果として、このシャードの書き込み容量がクラスターの実効書き込み容量を定義します。」
つまり、すべての OID はその直前に作成されたものよりも「大きく」ソートされるため、OID によってキー付けされた挿入は同じマシンに着陸し、その 1 つのマシンの書き込み I/O キャパシティは合計 I/O になります。クラスター全体の O。(これは OID だけでなく、予測可能なキー (タイムスタンプ、自動インクリメント番号など) にも当てはまります。)
逆に、シャード キーとしてランダムな文字列を選択した場合、書き込みはクラスター全体に均等に分散される傾向があり、スループットはクラスター全体の合計 I/O になります。
(完全な編集: OID シャード キーを使用すると、新しいレコードが「最も右の」シャードに配置されると、バランサーがそれらの移動を処理するため、最終的には他のマシンに配置されます。しかし、それは I/ああ、問題です; それは実際に事態を悪化させます.)
ObjectId は、グローバルに一意になるように設計されています。そのため、主キーとして使用され、新しいレコードが主キー値なしでデータセットに追加されると、各シャードは新しい objectid を生成でき、他のシャードとの衝突を心配する必要はありません。これにより、誰にとっても生活がいくらか簡素化されます:)