这里有新鲜出炉的 MongoDB 手册,程序狗速度看过来!
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 web 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个可扩展、高性能的分布式文档存储数据库,由 C 语言编写,下面这篇文章主要给大家介绍了关于 MongoDB 是如何存储数据的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
前言
本文主要介绍了关于 MongoDB 存储数据的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:
想要深入了解 MongoDB 如何存储数据之前,有一个概念必须清楚,那就是 Memeory-Mapped Files。
Memeory-Mapped Files
下图展示了数据库是如何跟底层系统打交道的。
MongoDB 的存储模型
数据文件与空间分配
当创建数据库时 (其实 MongoDB 没有显式创建数据库的方法,在向数据库中的集合写入数据时会自动创建该数据库),MongoDB 会在磁盘上分配一组数据文件,所有集合,索引和数据库的其他元数据都保存在这些文件里。数据文件被放在启动时指定的 dbpath 里,默认放入 / data/db 下面。典型的一个文件组织结构如下:
- $ cat /data/db
- $ ls -al
- -rw------- 1 root root 16777216 09-18 00:54 local.ns
- -rw------- 1 root root 67108864 09-18 00:54 local.0
- -rw------- 1 root root 2146435072 09-18 00:55 local.1
- -rw------- 1 root root 2146435072 09-18 00:56 local.2
- -rw------- 1 root root 2146435072 09-18 00:57 local.3
- -rw------- 1 root root 2146435072 09-18 00:58 local.4
- -rw------- 1 root root 2146435072 09-18 00:59 local.5
- -rw------- 1 root root 2146435072 09-18 01:01 local.6
- -rw------- 1 root root 2146435072 09-18 01:02 local.7
- -rw------- 1 root root 2146435072 09-18 01:03 local.8
- -rw------- 1 root root 2146435072 09-18 01:04 local.9
- -rw------- 1 root root 2146435072 09-18 01:05 local.10
- -rw------- 1 root root 16777216 09-18 01:06 test.ns
- -rw------- 1 root root 67108864 09-18 01:06 test.0
- -rw------- 1 root root 134217728 09-18 01:06 test.1
- -rw------- 1 root root 268435456 09-18 01:06 test.2
- -rw------- 1 root root 536870912 09-18 01:06 test.3
- -rw------- 1 root root 1073741824 09-18 01:07 test.4
- -rw------- 1 root root 2146435072 09-18 01:07 test.5
- -rw------- 1 root root 2146435072 09-18 01:09 test.6
- -rw------- 1 root root 2146435072 09-18 01:11 test.7
- -rw------- 1 root root 2146435072 09-18 01:13 test.8
- ...
- -rwxr-xr-x 1 root root 6 09-18 13:54 mongod.lock
- drwxr-xr-x 2 root root 4096 11-13 18:39 journal
- drwxr-xr-x 2 root root 4096 11-13 19:02 _tmp
来确认已使用空间和已分配空间。
- db.stats()
- {
- "db": "test",
- "collections": 37,
- "objects": 317894523,
- #文档总个数"avgObjSize": 232.3416429039893,
- #单位是字节"dataSize": 73860135744,
- #集合中所有数据实际大小 (包括padding factor为每个文档分配的额外空间以允许文档增长)。该值在文档size变小的时候,这个值不会减少,除非文档被删除,或者执行compact或者repairDatabase操作"storageSize": 97834319392,
- #分配给集合的空间大小 (包括为集合增长预留的额外空间和未分配的已删除空间,即不会因为文档size变小或者删除而减小),实际上从数据文件中分配给集合的空间是以块为单位,也称之为extents,即分配的extents的大小"numExtents": 385,
- "indexes": 86,
- "indexSize": 58687466992,
- "fileSize": 182380920832,
- #所有数据文件大小之和,不包括命名空间文件 (ns文件)"nsSizeMB": 16,
- "dataFileVersion": {
- "major": 4,
- "minor": 5
- },
- "ok": 1
- }
使用
确认某个集合的使用量
- db.accesslog.stats()
- {
- "ns": "test.accesslog",
- "count": 145352932,
- "size": 37060264352,
- #实际数据大小,不包括索引"avgObjSize": 254.967435758365,
- "storageSize": 45794676448,
- #预分配的数据存储空间"numExtents": 42,
- "nindexes": 4,
- "lastExtentSize": 2146426864,
- "paddingFactor": 1,
- #当文档因更新size增长时事先padding可以提速,减少碎片的产生"systemFlags": 1,
- "userFlags": 0,
- "totalIndexSize": 31897944512,
- "indexSizes": {
- "_id_": 6722168208,
- "action_1_time_1": 8606482752,
- "gz_id_1_action_1_time_1": 10753778336,
- "time_1": 5815515216
- },
- "ok": 1
- }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对 PHPERZ 的支持。
来源: http://www.phperz.com/article/17/0826/344461.html