MongoDB - 自定义_id字段上的散列索引的分片集合

时间:2014-07-24 20:43:25

标签: mongodb indexing sharding

问题:如何在自定义_id字段上按散列索引对集合进行分片?

问题描述:

  • 我需要存储对url => MongoDB中的my_value
  • 网址必须是唯一的
  • 我会执行大量查询来检查,如果我已经通过匹配{_id:md5(url_to_check)}
  • 已经拥有此类网址的文档
  • 收集量很大(数十亿对url => my_value),所以我想用网址对其进行分片。

解决方案,我认为:

使用以下字段创建集合:

  • _id:md5(url)
  • url:url
  • value:my_value 我没有创建任何索引。 _id默认由mongo
  • 索引

问题:

  • 我想通过_id分享集合。哈希共享密钥是完美的,但我是否必须创建哈希分片密钥或者我可以通过常规_id密钥进行分片?我自己插入_id已经计算过的md5。
  • 您如何看待存储在_id not-hashed网址和查询中?我会使用更少的空间(不必存储md5(url)),但是更大的文本字段和索引的分片将在biger字符串上(通常url有超过32个唱歌)
  • 解决此类问题的最佳解决方案是什么?对于我来说,最好的方法是快速查询并使用较少的索引空间,因为它是必需的?

1 个答案:

答案 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,您将只存储针对任何哈希冲突观察到的第一个网址(或者必须添加效率较低的内容,例如文档网址与原始网址的比较您期待着。)