MongoDB-通过自定义id字段上的散列索引进行碎片收集

MongoDB-通过自定义id字段上的散列索引进行碎片收集,mongodb,indexing,sharding,Mongodb,Indexing,Sharding,问题:如何通过自定义id字段上的散列索引对集合进行切分? 问题描述: 我需要在MongoDB中存储pairs url=>my_值 Url必须是唯一的 如果通过匹配{{u id:md5(url\u to\u check)}已经有了这样一个url的文档,我将执行很多查询来检查 集合将是巨大的(数十亿对url=>my_值),所以我想按url对其进行切分 解决方案,我认为: 使用以下字段创建集合: _id:md5(url) url:url 价值:我的价值 我不创建任何索引_id是mongo的默认索

问题:如何通过自定义id字段上的散列索引对集合进行切分?

问题描述:

  • 我需要在MongoDB中存储pairs url=>my_值
  • Url必须是唯一的
  • 如果通过匹配{{u id:md5(url\u to\u check)}已经有了这样一个url的文档,我将执行很多查询来检查
  • 集合将是巨大的(数十亿对url=>my_值),所以我想按url对其进行切分
解决方案,我认为:

使用以下字段创建集合:

  • _id:md5(url)
  • url:url
  • 价值:我的价值 我不创建任何索引_id是mongo的默认索引
问题:

  • 我想按_id切分集合。哈希共享密钥将是完美的,但我必须创建哈希切分密钥还是只能按常规_id密钥切分?我插入到已由我自己计算的md5中
  • 您如何看待将id存储在非散列url中并通过它进行查询?我将使用更少的空间(不必存储DMD5(url)),但切分将在更大的文本字段上进行,索引将在更大的字符串上进行(通常url有32个以上的符号)
  • 解决这个问题的最好办法是什么?对我来说,最好的方法是快速查询,并根据需要减少索引空间
我想按_id切分集合。哈希共享密钥将是完美的,但我必须创建哈希切分密钥还是只能按常规_id密钥切分?我插入到已由我自己计算的md5中

A用于单调增加的字段(如
ObjectId()
值或时间戳),以便在碎片上提供更均匀的写入负载分布。如果您已经散列了
\u id
值(或要切分的字段),则可以将其用作切分密钥,而不是请求服务器为您计算

仅供参考,MongoDB(2.6版)用于计算散列切分键,因此您已经在应用程序代码中有效地完成了相同的工作,并更有效地利用了
\u id
索引。对于预先散列的
\u id
值的用例,与两个索引相比,您只需要一个
\u id
索引(默认索引为
{id:1}
加上额外的散列索引
{id:hashed}

您如何看待将id存储在非散列url中并通过它进行查询?我将使用更少的空间(不必存储DMD5(url)),但切分将在更大的文本字段上进行,索引将在更大的字符串上进行(通常url有32个以上的符号)

如果需要考虑索引大小,那么较小的预计算值肯定会节省
\u id
索引中的空间(特别是如果您存储了数十亿个URL,并且只想通过md5哈希查找文档)

解决这个问题的最好办法是什么?对我来说,最好的方法是快速查询,并根据需要减少索引空间

最佳解决方案是非常主观的,但鉴于您已经分享了您的用例,这似乎是一个合理的解决方案

值得注意的是,任何散列的命名空间都可能有冲突,因此您可能需要考虑哈希算法相对于命名空间的情况。尽管发生冲突的可能性非常小,但如果将哈希值作为
\u id
,则只存储针对任何哈希冲突观察到的第一个url(或者必须添加效率较低的内容,例如将文档url与您期望的原始url进行比较)

我想按_id切分集合。哈希共享密钥将是完美的,但我必须创建哈希切分密钥还是只能按常规_id密钥切分?我插入到已由我自己计算的md5中

A用于单调增加的字段(如
ObjectId()
值或时间戳),以便在碎片上提供更均匀的写入负载分布。如果您已经散列了
\u id
值(或要切分的字段),则可以将其用作切分密钥,而不是请求服务器为您计算

仅供参考,MongoDB(2.6版)用于计算散列切分键,因此您已经在应用程序代码中有效地完成了相同的工作,并更有效地利用了
\u id
索引。对于预先散列的
\u id
值的用例,与两个索引相比,您只需要一个
\u id
索引(默认索引为
{id:1}
加上额外的散列索引
{id:hashed}

您如何看待将id存储在非散列url中并通过它进行查询?我将使用更少的空间(不必存储DMD5(url)),但切分将在更大的文本字段上进行,索引将在更大的字符串上进行(通常url有32个以上的符号)

如果需要考虑索引大小,那么较小的预计算值肯定会节省
\u id
索引中的空间(特别是如果您存储了数十亿个URL,并且只想通过md5哈希查找文档)

解决这个问题的最好办法是什么?对我来说,最好的方法是快速查询,并根据需要减少索引空间

最佳解决方案是非常主观的,但鉴于您已经分享了您的用例,这似乎是一个合理的解决方案

值得注意的是,任何散列的命名空间都可能有冲突,因此您可能需要考虑哈希算法相对于命名空间的情况。尽管发生冲突的可能性非常小,但如果将哈希值作为
\u id
,则只存储针对任何哈希冲突观察到的第一个url(或者必须添加效率较低的内容,例如将文档url与您期望的原始url进行比较)