0

mongodb のハッシュ化されたシャーディング キーの内部構造はどうなっているのだろうと思いました。たとえばタイムスタンプの場合、mongodb がフィールドをハッシュするために選択する定数は何ですか?
キーはタイムスタンプ % N になると思います。N とは何ですか?
これが設計であれば、N は経時的に変化しないのではないでしょうか。大量のデータがある場合、N が小さすぎる場合に 1 つのシャードで衝突が多すぎないことをどのように確認できますか?
ありがとう

4

1 に答える 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 に答える