MongoDB 查询 集合的存储属性

501 阅读3分钟

MongoDB 将数据库和集合数据存储在驻留在 mongod 服务器程序的—— dbpath 选项指定的路径中的文件中。

Dbpath 的默认值是/data/db。MongoDB 遵循一个预定义的方案将文档存储在这些文件中。

您可以使用 Mongo shell 查询集合的存储属性。

要使用shell,先启动Mongo 。然后使用命令行程序连接到服务器。连接之后,按如下方式查询集合的大小:

>db.movies.datasize(); 

327280

Dat,其中包含明尼苏达大学组透镜电影评级数据集的电影信息只有171308,但相应的集合要大得多,因为 MongoDB 格式存储了额外的元数据。返回的大小不是磁盘上的存储大小。只是数据的大小。为这个集合分配的存储可能有一些未使用的空间。

若要获取集合的存储大小,请进行以下查询:


>db.movies.storagesize(); 

500480

存储大小为500480,而数据大小要小得多,只有327280。

此集合可能有一些关联索引。若要查询集合的总大小(即数据、未分配存储和索引存储) ,可以按以下方式进行查询:

>db.movies.totalsize();

860928

要确保所有不同的值相加,请查询索引 size与名为 film 的集合关联的索引的集合名称。若要获取与电影集合相关的所有索引的完全限定名称以及数据库和集合名称,请按以下方式查询系统中的所有命名空间:

>db.system.namespaces.find()

我在 MongoDB 实例中有很多集合,所以列表很长,但是当前示例的相关信息如下:

{"name": "mydb.movies"}

{ "name": "mydb.movies.$_id_"}

Film 是集合本身,另一个是 mydb.film$_ id _,是 id 上索引元素的集合。要查看索引集合数据大小、存储大小和总大小,查询如下:

>db.movies.$_id_.datasize(); 

139264

>db.movies.$_id_.storagesize(); 

655360

>db.movies.$_id_.totalsize(); 

655360

您还可以使用集合本身获得索引数据大小,如下所示:

>db.movies.totalIndexsize();

360448

集合的总大小加起来就是存储大小和总索引大小。您还可以通过使用集合上的验证方法获得大小测量值等。您可以对电影集合运行如下验证:

db.movies.validate(); 

"ns": "mydb.movies", 

"result" : "\nvalidate\n firstExtent:0:51a800 ns:mydb.movies\n lastExtent:0:558b00 ns:mydb.movies\n # extents:4\n

datasize?:327280 nrecords?:3883 lastExtentsize:376832\n padding:1\n first extent:\n

loc:0:51a800 xnext:0:53bf00 xprev:null\n

nsdiag:mydb.movies\n

size:5888

firstRecord:0:51a8b0 lastRecord:0:51be90\n 3883 objects found, nobj:3883\n 389408 bytes data w/headers\n 327280 bytes

data wout/headers\n deletedList: 1100000000001000000\n deleted: n: 3 size: 110368\n nIndexes:2\n

mydb.movies.$_id_keys:3883\n

mydb.movies.stitle_1 keys:3883\n", "ok":1,

"valid": true,

"lastExtentsize":376832 }

验证命令提供的信息不仅仅是大小,还包括有关记录、标头、区段大小和键的信息。

MongoDB 将数据库及其集合存储在文件系统上的文件中。若要了解存储文件的大小分配,请列出它们的大小。在 Linux、 Unix、 Mac OS X 或任何其他 Unix 变体上,您可以列出以下大小:


1s -sk1~/data/db

total 8549376 

    0 mongod.lock 

65536 mydb.0 
131072 mydb.1 
262144 mydb.2 
524288 mydb.3 
1048576 mydb.4 
2096128 mydb.5 
2096128 mydb.6 
2096128 mydb.7 
16384 mydb.ns
65536 test.0 
131072 test.1 
16384 test.ns

输出来自 my/data/db 目录,对于您来说会有所不同。但是,数据库文件的大小模式不应该不同。这些文件对应于一个数据库。对于每个数据库,都有一个命名空间文件和多个数据存储文件。跨数据库的名称空间文件大小相同: 在我的64位 Snow Leopard MacOSX 上是16384字节或16MB。数据文件本身按顺序编号,从0开始。对于 mydb,模式如下:

  • mydb.o 的大小为65536字节或64 MB

  • mydb.1 是 mydb.o 的两倍,它的大小是131072字节或128 MB。

  • Mydb.2、 mydb.3、 mydb.4和 mydb.5分别为256 MB、512 MB、1024 MB (1 GB)和 A

~ 2047MB (2GB).

  • Mydb.6和 mydb.7分别为2GB,大小与 mydb.5相同。

MongoDB 增量地为数据文件存储分配较大的固定块。大小被限制在预先确定的级别,默认为2GB,超过这个级别,每个文件的大小与最大块的大小相同。MongoDB 的存储文件分配基于优化最小未使用空间和碎片的算法。

MongoDB 有更多的细微差别,特别是在内存管理和分片方面。


本文正在参加「金石计划 . 瓜分6万现金大奖」