0

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

随着服务器变得越来越忙,我想对它进行分片以确保我继续获得我目前正在从中获得的性能。当然,问题在于选择分片键。阅读此内容后,由于我的多键索引和缺少可能包含在主要查询中的其他字段,我似乎被查询隔离搞砸了。

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

有没有其他人遇到过这种情况?想想有什么好的选择吗?

4

1 回答 1

0

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

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

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

于 2013-01-16T17:32:01.123 回答