MongoDB是否以4MB的块存储文档?

时间:2011-03-14 13:27:50

标签: mongodb

我读到MongoDB文档的大小限制为4 MB。我还读到,当你插入一个文档时,MongoDB会添加一些填充,这样如果你在文档中添加一些内容,就不必移动整个文档并重新编制索引。

所以我想知道,它是否将文件以4MB的块存储在磁盘上?

由于

2 个答案:

答案 0 :(得分:5)

从1.8开始,单个文档的大小限制为16MB(之前为4MB)。这是一个限制性的限制,因为当您从磁盘读取文档时,整个文档将被读入RAM。所以我认为目的是这个限制是尝试和保护内存/让你考虑你的架构设计。

然后将数据存储在磁盘上的多个数据文件中 - 我忘记了初始文件大小,但每次数据库增长时,都会创建一个新文件进行扩展,其中每个新文件的创建大于前一个文件,直到达到2GB的单个文件大小。从现在开始,如果数据库继续增长,则会为要插入的文档创建后续的2GB数据文件。

“chunks”在MongoDB的分片方面有意义。因此,文档以可配置大小的“块”存储,当需要进行平衡时,就会移动这些数据块(n个文档)。

答案 1 :(得分:2)

简单的答案是“不”。文档在Mongo文件中占用的实际空间是可变的,但它不是最大文档大小。数据库引擎会监视插入后文档的更改量,并根据该值计算填充因子。所以它一直在变化。

如果您感到好奇,可以使用 mongo shell中集合上的.stats()函数查看数据的实际填充因子和存储空间。这是一个真实的例子(改变了一些名称以保护无辜的客户):

{14:42} ~/my_directory ➭ mongo
MongoDB shell version: 1.8.0
connecting to: test
> show collections
schedule_drilldown
schedule_report
system.indexes
> db.schedule_report.stats()
{
    "ns" : "test.schedule_report",
    "count" : 16749,
    "size" : 60743292,
    "avgObjSize" : 3626.681712341035,
    "storageSize" : 86614016,
    "numExtents" : 10,
    "nindexes" : 3,
    "lastExtentSize" : 23101696,
    "paddingFactor" : 1.4599999999953628,
    "flags" : 1,
    "totalIndexSize" : 2899968,
    "indexSizes" : {
        "_id_" : 835584,
        "WeekEnd_-1_Salon_1" : 925696,
        "WeekEnd_-1_AreaCode_1" : 1138688
    },
    "ok" : 1
}

所以我的测试集合中有大约16,749条记录,平均大小约为3.6 KB(“avgObjSize”),总数据大小约为60 MB(“size” )。但是,事实证明,由于填充因素,它们实际上在磁盘上占用了大约86 MB(“ storageSize ”)。随着集合文档的更新,填充因子随着时间的推移而变化,但如果我现在插入一个新文档 ,它将分配文档所需空间的1.46倍(“ paddingFactor“)以避免在以后更改它时移动东西。对我而言,这是一个公平的规模/速度权衡。