
一个MONGODB的使用者,可能会听到一个说法,就是不要在一个MONGODB的数据库中存放太多的collections ,翻译成RDBMS的语言,就是你不要在一个数据库中产生太多的表。
根据Mongodb的官方的解释,一个数据库 database 是有命名空间的,这些命名空间是用来存储mongodb的collections 的名字的,大小16MB。
同时索引也要使用这16MB的空间,也就是索引和collection都会使用这个共享的空间。同时即使你不建立索引,一个collection 在创建的时候就必须有一个_id的索引,而给出的方案如何扩大这个存储空间也是针对mmapv1 ,此时MOGNODB的引擎基本都是wiredtiger。
但即使是这样也没有理由说明在一个mongodb的数据库中为什么不建议创建过多的collections ?为了找原因,不断的搜索中,发现了另外一个问题,MONGODB 最好升级到4.0
在一篇文字中关于MONGODB在运行中产生一些问题莫名运行中会产生卡顿,其中描述了关于MONGODB 锁的问题。

其中 list collections 的锁的粒度是 Read 共享锁,以下的三个命令都属于list collections 的范畴,执行这个命令时会引起数据库运行中的与 X锁的冲突,造成数据库运行中的卡顿。原文https://mongoing.com/archives/26201
在MONGODB 4.0 修补了这个问题


4.0后的MONGODB 更改了list collections 的锁的粒度

提出的bug

https://jira.mongodb.org/browse/SERVER-34243
另外也温习了一下mognodb本身一些限制,总结一下
1 一个collection 中的行document 的限制为16MB
2 一个document 中的嵌套的level最大不能超过100
3 命名空间namespace 限制为123字符
4 数据库的名字大小不能超过64个字符
5 一个索引的单行大小不能超过1024bytes,一个符复合索引最大支持32个key
6 一个collection 不能超过64个索引
7 MONGODB 最大支持50个节点的复制集,并且最大只能有7个投票的节点
8 数据库中MOGNODB 的名字是大小写敏感的,但如果仅仅是通过大小写来产生同名的数据库是不被允许的

9 对于MONGODB的版本的不同MONGODB 4.4之前的版本collection的名字大小必须在120 bytes以下,如果是4.4后的版本可以提高到255bytes,名字中不能包含空格
10 在创建索引时 4.2.3 及之后的版本如果内存的大小小于200MB则在内存中直接建立索引如果超过则在_tmp 子目录下创建文件,之前的版本限制在500MB。

本文探讨了MongoDB数据库中不建议创建过多collections的原因,主要涉及命名空间限制和索引存储。MongoDB的数据库命名空间为16MB,用于存储collections和索引名称,同时索引也会占用这部分空间。即使不创建索引,每个collection也会有默认的_id索引。此外,文章提到了MongoDB在不同版本中关于listcollections命令锁粒度的问题,4.0版本后已进行修复。文章还总结了MongoDB的一些限制,如document大小、嵌套级别、命名空间长度等,为数据库设计和优化提供了参考。
1166

被折叠的 条评论
为什么被折叠?



