我应该为MongoDB选择什么样的Shard Key?

时间:2013-01-15 17:04:05

标签: mongodb

我目前有一台MongoDB服务器正在运行(正在生产中)。其中最大的集合称为用户。此集合具有多键(数组)索引。针对User集合的主要查询是$或对多键索引字段中的值的查询。此集合中的另一个字段是PageViews数组。

随着服务器变得越来越忙,我想对它进行分片以确保我继续获得我目前正在摆脱它的性能。当然,问题是选择分片键。阅读这篇文章似乎因为我的多键索引以及缺少可能包含在显性查询中的其他字段而被搞砸查询隔离。

各篇文章都指出,在随机值上创建分片键不是一个好主意。这是因为您失去了查询隔离。但是,鉴于我无论如何都无法实现良好的查询隔离,我应该对随机值进行分片吗?

还有其他人遇到过这种情况吗?想想任何好的选择吗?

1 个答案:

答案 0 :(得分:0)

我有一个我认为会有效的计划,所以我想我会与社区分享。

在我的场景中,多键索引字段包含许多由前缀消除歧义的项目。前缀表示存储在多键中的值的类型。

我的解决方案是找出最常查询的项目类型。在我的场景中,我知道这是什么,我会说这是超过90%的时间查询的项目类型。然后,我将在文档中创建另一个字段,该字段存储已保存到多键的此类型项的最后一个值。然后我将使用这个新字段作为分片键。最后,我将应用程序层更改为新字段上的第一个查询。如果该查询失败,我将对多键字段进行查询。我查询的90%以上应该是查询隔离的。其余的必须在所有分片上运行。似乎是一个很好的妥协。