假设我的文档看起来像这样:
{
"_id" : ObjectId("53d9560f2521e7a28f550a78"),
"tenantId" : "tenant1",
"body" : "Some text - it's the point of the document."
}
有几个明显不好的分片键选择:
{tenantId : 1}
这最终会给我很大的,不可分割的块。
{_id : 1}
有很多写入而且没有更新。升序钥匙会给我热点。
我认为我有两种可能性:
{tenantId : 1, _id : 1}
添加tenantId可以减轻_id的热点问题。我可以使用这个完整的密钥轻松搜索。
{_id : "hashed"}
没有热点,但我有顾虑......
我对哈希密钥的关注是,它现在是随机的。在Scaling MongoDB中,作者警告不要使用随机密钥,因为:
配置服务器注意到Shard 2还有10个块 碎片1并决定它应该是什么东西。 MongoDB现在必须加载 随机将五个块的数据存入内存并将其发送到Shard 这是通常不会在内存中的数据,因为它是完全随机的数据顺序。所以,现在MongoDB将会是 对RAM施加更大的压力,并且会有很多 磁盘IO正在进行(总是很慢)。
所以,我的问题是:如果你唯一的另一个选择是单调上升的键,那么散列键只是一个很好的选择吗?在我的情况下,tenantId和_id的组合会更好吗?
更新:要回答评论中的问题,我们只会逐个检索这些文档。因此,根据我们选择的分片键,查询将如下所示:
{_id : "53d9560f2521e7a28f550a78"}
或
{_id : "53d9560f2521e7a28f550a78", tenantId : "tenant1"}