nagylzs Asked: 2017-11-08 23:18:38 +0800 CST2017-11-08 23:18:38 +0800 CST 2017-11-08 23:18:38 +0800 CST GridFS:为什么我不能使用哈希键对块进行分片? 772 MongoDb 文档中有这样的说法: 分片 chunks 集合时不能使用散列分片。 它没有这么说,但我想这意味着我只能使用远程分片。但它似乎非常低效。事实上,他们建议分片键应该是 files_id 或 files_id + 块号。它们都单单增加。但是文档还说,当键单调增加时,您不应该使用范围分片。所以这里就有矛盾了。 为什么他们不允许我在块集合上使用散列分片?至少应该在文档中解释。 mongodb sharding 1 个回答 Voted Best Answer Stennie 2017-11-09T00:04:02+08:002017-11-09T00:04:02+08:00 GridFS 用于存储分块成较小文档的大型二进制数据(默认情况下,每个 255KB)。GridFS 的访问模式不同于分片集合,后者可能更需要随机文档分布(例如,使用散列分片键)。 使用 GridFS,与单个文件相关的文档通常按顺序读取:由 unique 标识files_id并由 chunk number 排序n。GridFS支持的分片键基于驱动程序重建 GridFS 字节流的顺序启用范围查询。散列分片键不支持范围查询,因此对读取性能极其无益(n需要块查找并且数据将随机分布)。 事实上,他们建议分片键应该是 files_id 或 files_id + 块号。它们都单单增加。 fs.chunks这两个字段的默认值确实单调增加,如果您使用默认的 ObjectID 值对集合进行分片,这将导致写入的热分片files_id。 块号应该是一个序列,但是如果你想在分片部署中改进 GridFS 的写入分布,你可以(并且应该)在上传文件时提供你自己的自定义 ID。官方 MongoDB 驱动程序应该提供一个 API,用于_id在创建新的 GridFS 文件时设置。 至少应该在文档中解释。 确实!我提出了DOCS-10993以改进 MongoDB 手册中的此信息。我怀疑驱动程序文档中也有改进,因此将审查这些作为记录总体建议的一部分。
GridFS 用于存储分块成较小文档的大型二进制数据(默认情况下,每个 255KB)。GridFS 的访问模式不同于分片集合,后者可能更需要随机文档分布(例如,使用散列分片键)。
使用 GridFS,与单个文件相关的文档通常按顺序读取:由 unique 标识
files_id
并由 chunk number 排序n
。GridFS支持的分片键基于驱动程序重建 GridFS 字节流的顺序启用范围查询。散列分片键不支持范围查询,因此对读取性能极其无益(n
需要块查找并且数据将随机分布)。fs.chunks
这两个字段的默认值确实单调增加,如果您使用默认的 ObjectID 值对集合进行分片,这将导致写入的热分片files_id
。块号应该是一个序列,但是如果你想在分片部署中改进 GridFS 的写入分布,你可以(并且应该)在上传文件时提供你自己的自定义 ID。官方 MongoDB 驱动程序应该提供一个 API,用于
_id
在创建新的 GridFS 文件时设置。确实!我提出了DOCS-10993以改进 MongoDB 手册中的此信息。我怀疑驱动程序文档中也有改进,因此将审查这些作为记录总体建议的一部分。