mongoDB 深入浅出一 了解mongoDB存储结构
MongoDB 深入浅出
数据逻辑结构
1 mongoDB 中的文档 (document) 相当于 关系性数据库的一条一条的记录
2 collection 相当于关系性数据库中的表,所以一个 collection 中有多个 document
3 多个集合在逻辑上组成一起 就是 database
4 一个 mongoDB 和 关系性数据库一样 可以有多个数据库 (database)
与关系数据结构比较
MongoDB |
关系性数据库 |
文档 (document) |
行 (row) |
集合 (collection) |
表 (table) |
Database |
Database |
数据存储结构
MongoDB 默认的数据目录是 data/db, 它负责存储所有 mongodb 的数据文件,在 mongoDB 中每个数据库都包含一个 .ns 和一些数据文件,而且这些数据文件会随着数据的增多越来越多,则: 如果系统中有一个叫 foo 的数据库,那么构成 foo 这个数据库的文件就会有 foo.ns ,foo.0,foo1,foo.2 等。
Mongodb 内部有预分配空间的机制,每个预分配的文件都用 0 填充,由于有了这个机制,
mongoDB 始终保存额外的空间和空闲的文件,这对系统数据突然暴增时减缓磁盘压力有很大好处 .
由于数据量的不断增加, mongoDB 每新分配一次,大小都会是上一个文件大小的 2 倍,最大 2G. 这种机制保证系统数据较小时 不会浪费太多空间,系统数据较多时 也有相应预留空间。
mongoDB 命名空间
每张表都有命名空间 , 每个索引也有对应的命名空间,这些命令空间的元数据都存在 .ns 文件中
在下图中, foo 数据库包含 3 个文件存储数据与索引, foo.2 文件属于预分配文件, foo.0 和 foo.1 被分配到了相应的盘区对应不同的名字空间。
从上图可以看出,每个命名空间可以包含多个不同的盘区,这些盘区并不是连续的,与数据增长一样,每一个命名空间的盘区大小也随着分配的次数不断增长。在上图有个 foo.$freelist 命名空间,这个命名空间用于记录不再使用的盘区 ( 如被删除的 collection 或索引 ) ,每当命名空间需要分配新的盘区时,就会检查 .$freelist 是否有合适大小的空间,这样就可以回收空闲的磁盘空间了。