数据库中集合数量的限制

时间:2012-03-25 06:44:15

标签: mongodb multi-tenant

有人可以说mongodb中的收藏数量有实际限制吗? 他们在这里写https://docs.mongodb.com/manual/core/data-model-operations/#large-number-of-collections

  

一般来说,拥有大量藏品并不重要   性能损失,并导致非常好的性能。

但由于某种原因,mongodb为数据库中的命名空间数设置了限制24000,看起来它可以增加,但我想知道为什么如果在数据库中有许多集合没有默认配置的限制导致任何性能损失?

这是否意味着在一个数据库中拥有几乎无限数量的集合是可行的解决方案,例如,在多租户应用程序的数据库中拥有一个帐户的一个数据集合,例如,数百个数据库中有数千个集合? 如果为每个租户提供数据库的大量集合是可行的解决方案,那么它的好处是什么,而不是在一个集合中拥有每个租户的文档? 非常感谢你的回答。

6 个答案:

答案 0 :(得分:32)

这个答案迟了但其他答案似乎有点......在可靠性和事实信息方面都很弱......所以我会尝试补救一点。

  

但由于某种原因,mongodb为数据库中的命名空间数量设置了限制24000,

这只是默认设置。是的,有一个默认设置。

它确实在限制页面上说24000是限制(http://docs.mongodb.org/manual/reference/limits/#Number%20of%20Namespaces),好像没有办法扩展它但是有。

然而,命名空间文件的大小(http://docs.mongodb.org/manual/reference/limits/#Size%20of%20Namespace%20File)最大限制为2GB。在大多数情况下,这给你大约300万个命名空间,这是非常令人印象深刻的,我不确定很多人是否会很快达到这个限制。

您可以通过在配置(http://docs.mongodb.org/manual/reference/configuration-options/#nssize)内使用nssize参数或在运行时通过操作用于运行MongoDB(http://docs.mongodb.org/manual/reference/mongod/#cmdoption-mongod--nssize)的命令来修改默认值以使其高于16MB。 / p>

据我所知,没有真正的理由为什么MongoDB默认为其nssize实现了16MB,我从来没有听说过“不打扰每个细节的用户”的座右铭所以我不买那个

我认为,在我看来,MongoDB隐藏这个的主要原因是因为尽管如文档所述:

  

不同的集合对于高吞吐量批处理非常重要。

使用多个集合作为垂直扩展而非横向扩展的方法,正如MongoDB所设计的那样,被认为(通常)是大型网站的不良做法;因此,12K系列通常被认为是人们永远不应该确定的东西。

答案 1 :(得分:16)

没有更多限制!

正如其他答案所述 - 这取决于命名空间文件的大小。这是以前的问题,因为它的默认限制为16mb,最大为2gb。但是,随着MongoDB 3.0和WiredTiger存储引擎的发布,看起来这个限制已被删除。 WiredTiger似乎在几乎所有方面都更好,所以除了传统的支持原因外,我认为没有人使用旧引擎。来自网站:

  

对于MMAPv1存储引擎,命名空间文件不能大于   2047兆字节。

     

默认情况下,命名空间文件为16 MB。你可以配置   使用nsSize选项调整大小。

     

WiredTiger存储引擎不受此限制。

http://docs.mongodb.org/manual/reference/limits/

答案 2 :(得分:13)

一点背景:

每次mongo创建数据库时,它都会为它创建一个命名空间(db.ns)文件。命名空间(或您可能想要调用它的集合)文件包含有关集合的元数据。默认情况下,命名空间文件的大小为16MB,但您可以手动增加大小。每个集合的元数据是648个字节+一些开销字节。除以16MB,每个数据库大约有24000个命名空间。您可以通过指定更大的命名空间文件来启动mongo,这样可以为每个数据库创建更多的集合。

任何默认配置背后的想法是不打扰每个细节(和可配置旋钮)的用户,并选择一般适用于大多数人。此外,可行性与最佳/良好的设计实践密切相关。正如克里斯所说,考虑数据的形状并做出相应的决定。

答案 3 :(得分:4)

正如其他人所提到的,默认名称空间大小为16MB,您可以获得大约24000个名称空间条目。实际上,我在Ubuntu中的64位实例使用默认的16MB命名空间文件在23684处达到顶峰。

FAQ中未提及的一个重要事项是索引也使用命名空间槽。

您可以使用以下命名计算命名空间条目:

db.system.namespaces.count()

实际上看看那里的内容也很有趣:

db.system.namespaces.find()

将限制设置为高于您认为需要的限制,因为一旦创建了数据库,命名空间文件就无法扩展(据我所知 - 如果有办法,请告诉我!!!)。

答案 4 :(得分:3)

实际上,我从未遇到过最大限度的问题。但我绝对没有超过24,000集合限制。我很确定我从未超过200,除了我在测试时的性能。我不得不承认,我认为在一个数据库中拥有这么多集合,而不是将数据分组到自己的集合中,这听起来很混乱。

考虑数据和业务规则的形状。如果您的数据需要布局,以便您必须将数据分成多租户应用程序的不同逻辑分组,那么您可能应该考虑其他数据存储。因为虽然Mongo很棒,但他们对收藏量的限制这一事实告诉我他们知道在性能受到影响的情况下存在理论限制。

也许您应该考虑一个与数据形状相匹配的商店?例如,Riak在您的应用程序中拥有无限数量的“桶”(没有理论上的最大值)。每个帐户一个桶是完全可行的,但是你通过朝着那个方向牺牲一些可用性。

否则,您可能希望遵循更喜欢的分组关系模型。在我看来,Mongo感觉就像是关系数据库和键值存储之间的中间点。这意味着它更容易将其概念化来自关系数据库世界。

答案 5 :(得分:3)

维护馆藏似乎有很大的开销。我刚刚将一个数据库减少了一个数据库,该数据库在11000个集合中拥有大约1.5个十字架的文档,而在300个集合中的文档数量相同。这将数据库的大小从8GB减少到1GB。我不熟悉MongoDB的内部工作方式,所以这可能是显而易见的,但我认为在这种情况下可能值得注意。