mongodb のハッシュ化されたシャーディング キーの内部構造はどうなっているのだろうと思いました。たとえばタイムスタンプの場合、mongodb がフィールドをハッシュするために選択する定数は何ですか?
キーはタイムスタンプ % N になると思います。N とは何ですか?
これが設計であれば、N は経時的に変化しないのではないでしょうか。大量のデータがある場合、N が小さすぎる場合に 1 つのシャードで衝突が多すぎないことをどのように確認できますか?
ありがとう
質問する
947 次
1 に答える
1
ハッシュされたキーは、ドキュメント内のデータと標準ハッシュ関数 (MD5) を使用して、ドキュメントのハッシュ値を生成します。たとえば、インデックスが有効で、{name: 'hashed'}
次のドキュメントがあるとします。
{name: 'John', height: 73}
{name: 'Zardosht', height: 68}
MongoDB はMD5 ハッシュ関数を介して'John'
実行され、ランダムに見えるバイト シーケンスを取得します。'Zardosht'
次に、それらのバイト シーケンスを、インデックスで使用する実際の B ツリー キーとして使用します。に対してクエリを実行する場合{name: 'John'}
、MD5 ハッシュが再度実行され、以前に取得したのと同じバイト シーケンスが取得され、実際にその値のインデックス ルックアップが実行されます。
mongo シェルで遊んで、これらの値が自分でどうなるかを実際に確認できます。
% mongodb-linux-x86_64-2.2.5/bin/mongo
MongoDB shell version: 2.2.5
connecting to: test
> db.runCommand({_hashBSONElement: {name: "John"}})
{
"key" : {
"name" : "John"
},
"seed" : 0,
"out" : NumberLong("5553133884637223031"),
"ok" : 1
}
> db.runCommand({_hashBSONElement: {name: "Zardosht"}})
{
"key" : {
"name" : "Zardosht"
},
"seed" : 0,
"out" : NumberLong("8641066842148283865"),
"ok" : 1
}
N
私が説明したものには何もないことに注意してください。そのため、そのような制限について心配する必要はありません。
于 2013-08-26T18:52:01.713 に答える