Mongodb占据的磁盘空间比MySQL大得多,可以理解文档数据如Json这种格式,存在许多冗余数据,但空间占用大得不正常,甚至是传统数据库的三四倍,不太契合工程实践,应该有改善的余地。 查阅了一些资料,具体理下Mongodb的空间分配。

  
      1. MongoDB每个库逻辑上包含许多集合(collection),物理上存储为多个数据文件,数据文件的分配是预先分配的,预分配的方式可以减少碎片,程序申请磁盘空间的时候更高效,但MongoDB预分配的策略可能导致空间的浪费。默认的分配空间的策略是:随着数据库数据的增加,MongoDB会不断分配更多的数据文件。每个新数据文件的大小都是上一个已分配文件的两倍( 64M, 128M, 256M, 512M, 1G, 2G, 2G, 2G ),直到预分配文件大小的上限2G。虽然2G的阀值可以调整,但一般运维等时候往往也不会去调整,就这点来说,可能导致空间的浪费。(可以这样理解,原本一个collection大小为2M,增加了一个100K的数据后,现在该collection大小变为2M*2=4M,这种分配策略会浪费内存,但会避免产生碎片)
 
对于磁盘的空间的分配效率,我报以怀疑的态度,如果本身有IO瓶颈,预分配一个2G的文件,将可能导致服务出现严重性能问题。预分配文件,可以减少碎片,提高程序申请空间的效率,但有无必要一次分配初始化一个巨大的文件,这点值得商榷。 虽然预分配的机制,文档记载是可以关闭的,但一般使用NOSQL产品都是会使用默认配置,也建议使用默认的配置,因默认配置往往经历了长久的考验,没有那么多bug。
 
 

2. MongoDB的文档在数据文件中是连续存储的,这点不同于一些关系数据库的做法(它们会把长记录拆分为两部分,溢出的那部分单独存放在另一处),如果没有预留足够的空间,那么更新可能导致原有空间放不下新的文档。当更新迫使引擎在BSON存储中移动文档时,存储碎片可以导致意外的延迟。对此MongoDB官方的解释是如下,

“如果有足够的空间,在MongoDB中更新文档时,数据会在原地更新。如果更新后的文档大小大于已经分配的空间,那么文档会在一个新位置被重写。MongoDB最终会重用原来的空间,但这可能需要时间,而且空间可能会过度分配。

在MongoDB 2.6中,默认的空间分配策略将是powerOf2Sizes,这个选项从MongoDB 2.2开始就已经提供了。该设置会将MongoDB分配的空间大小向上取整为2的幂(比如,2、4、6、8、16、32、64等等)。该设置会降低需要移动文档的几率,并使空间可以更高效地重用,结果是更少的空间过度分配和更可预测的性能。用户仍然可以使用精确匹配的分配策略,如果文档大小不增加,该策略更节省空间。”

显然,这种策略又将导致空间的浪费,特别是对于导入只读类型的数据。

3. MongoDB不支持数据文件的压缩,也不能回收空间它所使用的碎片整理的策略,可能是在一个新的地方重写,而不是对旧的碎片进行整理、合并。

4. 不校验数据页。页面校验对于数据库是非常重要的,有助于识别存储设备异常。就这点,MongoDB存储的数据是不安全的,也许哪天就起不来了。

MongoDB空间分配的更多相关文章

  1. 【mongodb】Mongodb初识

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...

  2. Mongodb Manual阅读笔记:CH7 索引

    7索引 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔记 ...

  3. MongoDB 3.0 新特性【转】

    本文来自:http://www.open-open.com/lib/view/open1427078982824.html#_label3 更多信息见官网: http://docs.mongodb.o ...

  4. MongoDB学习笔记二:创建、更新及删除文档

    插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个&q ...

  5. MongoDB如何存储数据

    想要深入了解MongoDB如何存储数据之前,有一个概念必须清楚,那就是Memeory-Mapped Files. Memeory-Mapped Files 下图展示了数据库是如何跟底层系统打交道的. ...

  6. [转载]MongoDB优化的几点原则

    .查询优化 确认你的查询是否充分利用到了索引,用explain命令查看一下查询执行的情况,添加必要的索引,避免扫表操作. .搞清你的热数据大小 可能你的数据集非常大,但是这并不那么重要,重要的是你的热 ...

  7. 每天200亿次查询 – MongoDB在奇虎360【转】

    100多个应用,1,500多个实例,每天200亿次查询 奇虎是中国最大的安卓移动发布平台.奇虎也是中国最顶尖的病毒软件防护公司,同时为网络以及移动平台提供产品.自从2011年成为MongoDB的用户之 ...

  8. MongoDB存储引擎(中)——WiredTiger

    上一篇博文介绍了MongoDB的MMAPv1存储引擎,本文接着介绍MongoDB另一个存储引擎--WiredTiger,WiredTiger是在MongoDB3.0版本引入的,并且在MongoDB3. ...

  9. MongoDB最佳实践中文手册

    背景:查阅了一下MongoDB的相关文档,发现中文文档还是比较少的,工作中需要用到MongoDB,而这本<MongoDB最佳实践>是很好的选择,所以就把这本手册翻译了一下,其中生涩的专业用 ...

随机推荐

  1. TZOJ3114: {A}∩{B}

    #include<stdio.h> int main() { ],b[],m,i,j,c; scanf("%d",&t); while(t--) { c=; s ...

  2. Harbor 批量清理历史镜像

    公司 Harbor 仓库一年多没清理,硬盘被堆满了,为此写了个批量清除的 Python 脚本. 源代码见 github-harbor_clean.py # coding: utf-8 from ope ...

  3. docker 启动 容器----bootstrap checks failed

    错误信息: bootstrap checks failed 解决方法: 1.修改elasticsearch.yml配置文件,允许外网访问. vim config/elasticsearch.yml,增 ...

  4. java常见排序算法

    今天去面试的时候又考了排序算法,排序这个东西,你以为你懂了,但是真正去写的时候才会发现好多细节自己都模棱两可,我写着写着就全都乱了,回来之后赶紧重新写一遍. (1)冒泡排序 public void b ...

  5. 一行css代码搞定响应式布局

    在这篇文章中,我将教你如何使用 CSS Grid 来创建一个超酷的图像网格图,它将根据屏幕的宽度来改变列的数量.最精彩的地方在于:所有的响应特性被添加到了一行 css 代码中.这意味着我们不必将 HT ...

  6. MySQL库的相关操作

    再熟悉一下Mysql库.表.记录的基本操作. 库 增 create database userinfo1 charset utf8; 查 show databases; show create dat ...

  7. CSS选取第一个、最后一个、偶数、奇数、第n个标签元素

    1.first-child first-child表示选择列表中的第一个标签.例如:li:first-child{background:#fff} 2.last-child last-child表示选 ...

  8. Bootstrap源码

    1.Bootstrap Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML.CSS.JavaScript 开发的简洁.直观.强悍的前端开 ...

  9. djangoNotes

    学员管理 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  10. Android笔记(二十三) Android中的ProgressBar(进度条)

    圆形进度条和水平进度条 进度条也是UI界面一种非常实用的组件,通常用于向用户显示某个耗时操作完成的百分比,进度条可以动态的显示进度,避免长时间的执行某个耗时操作时,让用户感觉程序失去了相应,从而更好的 ...