2

从书缩放MongoDB:

一般情况

我们可以将其推广到分片键的公式:{coarseLocality : 1, search : 1}

所以我的问题是,这对吗?不应该是更好的写作的对立面吗?

同样来自书中:

这种模式仍在继续:所有内容都将始终添加到“最后一个”块中,这意味着所有内容都将添加到一个分片中。这个分片键为您提供了一个单一的、不可分发的热点。

所以说我的应用程序总是按 user_id 和集合中的最后一个条目进行搜索。

我应该拥有的最好的分片键是什么,这个:

{_id:1, user_id:1}

或者:

{user_id:1,_id:1}
4

1 回答 1

7

Kristina(Scaling MongoDB的作者)写了一篇博文,其中有一些以游戏为幌子解释的示例策略:如何选择分片密钥:纸牌游戏

根据您的应用程序要求和用例选择一个好的分片键有很多考虑因素。

顺序的一般建议{coarseLocality : 1, search : 1}是确保您的数据具有某些局部性以供阅读。

所以在你的情况下,你很可能想要:{user_id:1,_id:1}.

这将在查询时为相同的数据提供一些局部性user_id,理想情况下,您的常见查询将能够从单个分片中获取它们的数据。

相反的顺序可能会提供更好的写入分布(假设 _id 不是像默认ObjectId那样单调递增的键),但潜在的缺点是可靠性:如果您用于读取查询的数据分散在所有分片中,那么您将遇到检索问题(如果有)一个碎片掉了。

所以说我的应用程序总是按 user_id 和集合中的最后一个条目进行搜索。

如果您通常使用user_id(或不使用_id)搜索,这也会影响您对分片键和索引优化的选择。要找到最后的条目,MongoDB 必须进行排序;您将希望在单个分片上进行排序,而不必从所有分片中收集数据并进行排序。如果您_id碰巧是基于日期的,那么作为分片键的一部分将有利于查找最后的条目。

于 2012-08-06T03:05:29.260 回答