我想知道 mongodb 中散列分片键的内部结构是什么。例如,如果它是时间戳,mongodb 选择对我的字段进行哈希处理的常量是什么?
我猜关键是 timestamp % N ; 什么是 N?
如果这是设计,我猜 N 不能随时间改变。如果 N 太小,我如何确定如果我有大量数据,则 1 个分片中不会发生太多冲突?
谢谢
问问题
947 次
1 回答
1
散列键使用文档中的数据和标准散列函数 (MD5) 为文档生成散列值。例如,假设您的索引已打开{name: 'hashed'}
并且您有以下文档:
{name: 'John', height: 73}
{name: 'Zardosht', height: 68}
MongoDB 将运行'John'
并'Zardosht'
通过 MD5 哈希函数并获得看起来随机的字节序列。然后,它将使用这些字节序列作为要在索引中使用的实际 B 树键。当您想查询 时{name: 'John'}
,它会再次执行 MD5 哈希,获取与之前相同的字节序列,然后实际执行该值的索引查找。
您可以使用 mongo shell 并实际查看这些值对自己来说是什么:
% 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 回答