gpt4 book ai didi

mongodb - 120 个 mongodb 集合与单个集合 - 哪个更有效?

转载 作者:IT老高 更新时间:2023-10-28 13:06:05 25 4
gpt4 key购买 nike

我是 mongodb 的新手,我在 DB Schema 设计方面面临两难:

我应该创建一个集合还是将我的数据放入多个集合中(我想我们可以称之为这些类别)。

现在我知道有人问过很多这样的问题,但我相信我的情况有所不同,原因有两个:

  • 如果我要收集很多系列,我将不得不创建大约 120 个,仅此而已。这在未来不会增长。
  • 我知道我永远不需要查询或插入多个集合。我总是只需要查询一个,因为集合 X 中的文档与存储在其他集合中的任何文档都不相关。文档可能包含对数据库其他部分的引用(例如 userId 等)。

所以我的问题是:这 120 个集合能否提高查询性能?在我的情况下,这是一个有用的优化吗?

或者我应该只使用单个集合 + 分片?

每个集合都应包含数百万个文档。如果只使用一个,它将存储数十亿个文档。

提前致谢!

------- 编辑:

感谢您的精彩回答。

事实上,120 个集合只是一个自制的限制,并不是真正的最优:

集合中的数据与网络发布者有关。可能有数百万个(任何网站都可以加入)。

我想理想的情况是我可以为每个发布者创建一个集合(仅保存他们的数据)。但显然,由于 mongo 的限制,这是不可能的。

所以我想出了固定数量的集合的想法,以至少以某种方式分发数据。比如:集合“A_XX”将保存名称以“A”开头的发布者的 XX 平台相关数据。等等。我们只支持其中的几个平台,所以 120 个集合应该绰绰有余。

在另一个网站上,有人建议使用多个数据库而不是多个集合。但这意味着开销,然后我将不得不使用/管理许多不同的连接。

您对此有何看法?有更好的解决方案吗?

抱歉,我最初的问题不够具体。

提前致谢

最佳答案

单个分片集合

问题的编辑版本使实际要求更加清晰:您有一个可能会变得非常大的集合,并且您想要一种对数据进行分区的方法。人工收集限制是你自己规划的分区方案。

在这种情况下,我认为您最好使用单个集合并利用 MongoDB 的 auto-sharding根据需要将数据和工作负载分配到多个服务器的功能。多个集合仍然是一种有效的方法,但与利用核心 MongoDB 功能相比,它会使您的应用程序代码和部署变得不必要地复杂化。假设你 choose a good shard key ,您的数据将在您的分片之间自动平衡。

您不必立即分片;您可以推迟决定,直到您看到您的工作负载实际上需要更多的写入规模(但知道在需要时可以选择该选项)。在决定分片之前,您还有其他选择,例如升级您的服务器(尤其是磁盘和内存)以更好地支持您的工作负载。相反,您不想等到系统被工作负载压垮后再进行分片,因此您肯定需要监控增长。我建议使用免费的MongoDB Monitoring Service (MMS)由 10gen 提供。

On another website someone suggested using many databases instead of many collections. But this means overhead and then I would have to use / manage many different connections.

多个数据库会显着增加管理开销,并且可能会过度杀伤力,并且可能对您的用例有害。存储是在数据库级别分配的,因此 120 个数据库将比具有 120 个集合的单个数据库消耗更多的空间。

固定数量的集合(原始答案)

如果您可以计划固定数量的集合(根据您的原始问题描述为 120 个),我认为采用这种方法比使用单一集合更有意义。

注意:下面的设计注意事项仍然适用,但由于更新了问题以阐明多个集合是一种尝试的分区方案,因此对单个集合进行分片将是一种更直接的方法。

使用单独集合的动机是:

  • 您的单个​​大型集合的文档可能必须包含一些集合子类型的指示,这可能需要添加到多个索引中,并且可能会显着增加索引大小。对于单独的集合,子类型已经隐含在集合命名空间中。

  • 在集合级别启用分片。单个大型集合只为您提供“全有或全无”的方法,而单个集合允许您控制需要分片的数据子集并选择更合适的分片键。

  • 您可以使用 compact命令对单个集合进行碎片整理。 注意: compact 是一种阻塞操作,因此对于 HA 生产环境的正常建议是部署副本集并使用滚动维护(即先压缩辅助节点,然后降级并压缩主节点)。

  • MongoDB 2.4(和 2.2)目前具有数据库级别的写锁粒度。在实践中,这对于绝大多数用例来说都不是问题,但是如果需要,多个集合可以让您更轻松地将高事件集合移动到单独的数据库中。

  • 进一步说……如果您将数据放在单独的集合中,这些将能够利用 future 对集合级锁定的改进(参见 MongoDB Jira 问题跟踪器中的 SERVER-1240)。

关于mongodb - 120 个 mongodb 集合与单个集合 - 哪个更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16099058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com