问题:如何在自定义_id字段上按散列索引对集合进行分片?
问题描述:
解决方案,我认为:
使用以下字段创建集合:
问题:
答案 0 :(得分:4)
我想通过_id进行分片收集。哈希共享密钥是完美的,但我是否必须创建哈希分片密钥或者我可以通过常规_id密钥进行分片?我自己插入_id已经计算过的md5。
hashed shard key旨在与单调增加的字段(如ObjectId()
值或时间戳)一起使用,以便在分片中提供更均匀的写入负载分配。如果您已经散列了_id
值(或者您想要分片的字段),则可以将其用作分片键而不是,请求服务器为您计算。< / p>
仅供参考,MongoDB(截至2.6)使用md5计算散列分片键,因此您已经在应用程序代码中进行了相同的工作并更有效地使用_id
索引。使用预先散列_id
值的用例,与两个索引(默认索引_id
加上额外的散列索引{{1})相比,您只需要一个{_id:1}
索引})。
您如何看待存储在_id not-hashed网址和查询中?我会使用更少的空间(不必使用storedmd5(url)),但是分片将在更大的文本字段和索引将在biger字符串上(通常url有超过32个唱歌)
如果索引大小是一个问题,较小的预计算值肯定会节省{_id:hashed}
索引中的空间(特别是如果您要存储数十亿个URL并且只想通过md5哈希查找文档)。
解决此类问题的最佳解决方案是什么?对我来说,最好的方法是快速查询并使用较少的索引空间,因为它是必需的?
最佳解决方案非常主观,但考虑到您对用例的分享,这似乎是一个合理的解决方案。
值得注意的是,任何哈希命名空间都可能发生冲突,因此您可能需要考虑相对于命名空间的哈希算法的collision resistance。尽管碰撞应该是极不可能的,将哈希值作为您的_id
,您将只存储针对任何哈希冲突观察到的第一个网址(或者必须添加效率较低的内容,例如文档网址与原始网址的比较您期待着。)