散列碎片键是否适合我?

时间:2014-08-05 18:03:50

标签: mongodb

假设我的文档看起来像这样:

{
  "_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"}

0 个答案:

没有答案