[mongodb] MMAPv1 Storage Engine
MMAPv1 是mongodb 在3.2以前默认的存储引擎,在3.2 之后默认的存储引擎为WiredTiger,MMAPv1存储引擎基于内存映射文件,它擅长高容量的插入,读取和更新。
Journal
为了确保所有对mongodb 数据集的修改是可持续的写到磁盘中,mongodb 默认所有的记录都写在磁盘中的日志里面,mongodb写日志比写数据文件更加平凡。默认的情况下,mongodb每隔60秒写到磁盘中的数据文件一次,而写日志文件粗略的每隔100毫秒,这些值都是他们写数据文件的最大时间间隔,在更多的mongodb的应用例子中,mongdb和操作系统刷新数据到磁盘是更加频繁的,因此这些值都是理论上的最大值。,去改变日志文件写的时间间隔,看 storage.syncPeriodSecs ,改变日志文件写入的时间间隔看storage.journal.commitIntervalMs。
当mongdb的实例退出后,这些日志允许mongdb从数据文件中恢复数据并不刷新所有的改变。
Record Storage Characteristics
所有的记录被写进磁盘中,当一个document变的比被分配到的磁盘的地址空间更大的时候,mongdb 必须分配一个新的地址,新的地址要求mongodb 移动这个document 和更新与这个document 有关的所有的索引,这将导致需要花费更多的时间去更新地址和整理存储碎片。
值得庆幸的是,在mongdb3.0以后的版本中,有所改变,默认的情况下,3.0以后的版本中, 使用了 Power of 2 Sized Allocations,每一个在mongdb中的document被存储在一个磁盘空间中,这个空间包括他自己和一些额外的空间,这些额外的空间允许document更新导致的增长以最大可能的减少重新分配。
Record Allocation Strategies
mongodb 支持多个空间分配策略,当分配一个空间时,这些策略决定mongod 怎样增加一个额外的空间到这个doument上,因为在mongodb 中,document在插入后是可以增加的,所有的记录都在磁盘上,一个额外的空间可以减少一个document在更新变大重新分配空间的需要。重新分配更新空间效率是比在本地空间更新效率低,并且重新分配空间导致存储的碎片,因此,所有的另外增加额外的(padding stratrgies)策略交换另外的空间提高了效率减少了碎片。
不同的策略支持不同的工作负载,lead to storage fragmentation 是对插入更新和删除的工作负载时更佳有效的, exact fit allocations(精确分配)是一个好的策略对于一个没有更新和删除的工作负载。
Power of 2 Sized Allocations
mongodb 在3.0 以后的版本中默认使用了Power of 2 Sized Allocations 的分配策略为MMPAPv1,每一个空间的大小都是2的指数比特(如:32,64,128,256,512 ... 2MB),由于文档的大小都超过了2MB ,分配的空间被上升到了2MB 的倍数。
The power of 2 sizes有如下关键的属性:
* 可以有效的重新释放空余的空间用来减少分裂。把特定的空间大小转化为一个固定大小增加的集合,插入的数据将保存在可能被更早的document删除或者搬迁创造的空间中。
*可以减少移动,增加额外的装饰空间给一个document不需要移动就可以增长空间。另外,节省了移动的花费,在不需要更多的去更新索引。虽然The power of 2 sizes策略可以最大程度的减少移动,但是不能完全的消除。
No Padding Allocation Strategy
对于一些collections 工作不改变文档的大小,如插入和更新工作,这些工作都不增加文件的大小,这个时候The power of 2 sizes 策略是没用的,你可以使用collMod 命令或者db.createCollection() 方法并且用nopadding 对象。
在3.0以前,mongdb 使用一个分配策略,这个策略包括动态计算padding 作为一个document 大小的因素。
Memory Use
使用MMAPv,mongodb 自动使用所有机器的空闲的内存作为它的cache,系统资源监视器监视mongodb 使用的内存情况,这意外这着mongodb将尽可能多的使用空闲的内存,如果其他的进程突然需要服务器大量的内存,mongdb 将会缓存内存到其他的进程。
严格的来说,操作系统的虚拟内存的子系统管理mongdb内存,这意外着mongodb将尽可能的使用更多的空闲的内存,按照实际需要内存和磁盘进行数据交换,部署充足的内存去使应用程序工作的数据集有充足的RAM,使mongodb 达到最好的性能。
[mongodb] MMAPv1 Storage Engine的更多相关文章
- [mongodb] WiredTiger Storage Engine
今天看了mongodb的官方文档中的WiredTiger Storage Engine ,说说我对WiredTiger Storage Engine 的理解! 在mongodb3.2版本以后,wire ...
- MongoDB出现The default storage engine 'wiredTiger' is not available之问题解决
问题描述:低版本MongoDB存在该问题(版本为3.x),高版本则无该问题. 参考解决问题链接:MongoDB学习—(1)安装时出现The default storage engine ‘wiredT ...
- storage engine option for directoryPerDB
Requested option conflicts with current storage engine option for directoryPerDB; you requested true ...
- MySQL报错:Got error 28 from storage engine
今天碰到数据库出错: Got error 28 from storage engine 查了一下,数据库文件所在的盘应该没事,应该是数据库用的临时目录空间不够 问题原因: 磁盘临时空间不够导致. 解决 ...
- MySQL - 问题集 - "Got error 28 from storage engine"
数据库的临时目录空间不够,修改配置文件中的tmpdir,指向一个硬盘空间很大的目录即可. windows下,找到配置文件my.ini. [mysqld] tmpdir=D:/work/tool/mys ...
- Mysql: ERROR 1030 (HY000): Got error 28 from storage engine
今天帮同事解决一个问题的时候,遇到了下面的异常: ERROR 1030 (HY000): Got error 28 from storage engine 我们的数据库是mysql,我们的sql语句是 ...
- MEMORY Storage Engine MEMORY Tables TEMPORARY TABLE max_heap_table_size
http://dev.mysql.com/doc/refman/5.7/en/create-table.html You can use the TEMPORARY keyword when crea ...
- mysql 1030 Got error 28 from storage engine
mysql 1030 Got error 28 from storage engine 错误原因:磁盘临时空间不够. 解决办法:df -h 查看设备存储的使用情况 du -h --max-depth= ...
- 在phpmyadmin中执行sql语句出现的错误:Unknown storage engine 'InnoDB'
在phpmyadmin中执行sql语句出现的错误:Unknown storage engine 'InnoDB' 解决方法:解决方法: 1.关闭MySQL数据库 2 ...
随机推荐
- iOS开发之--Mac终端命令大全
目录操作 命令名 功能描述 使用举例 mkdir 创建一个目录 mkdir dirname rmdir 删除一个目录 rmdir dirname mvdir 移动或重命名一个目录 mvdir dir1 ...
- Servlet初始化及处理HTTP请求
上一篇详细介绍了与Servlet相关的几个核心的接口和类,当我们自己写Servlet类时,一般需要继承HttpServlet类,实现init().doGet().doPost()等方法.当我们写好Se ...
- Java读取、创建Excel;验签,加密
需要架包:poi相关jar,Md5.jar------------------------------------------------------------------------------- ...
- html常见兼容性问题
html常见兼容性问题? 1.双边距BUG float引起的 使用display 2.3像素问题 使用float引起的 使用dislpay:inline -3px 3.超链接hover 点击后失效 ...
- Python SQLAlchemy基本操作和常用技巧
转自:https://www.jb51.net/article/49789.htm 首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同.因为我是搭配 M ...
- 好难忘又伤心一个非常好的学习js群解散了
不知道为什么看到web前端之天天向上这个群解散,好难过.应该可以说,这个群是我见过比较靠谱的群,大家都非常热情帮助.那些管理员管理的非常好,突然解散了.觉得好可惜,也不会因为你是菜鸟不让你加,感觉好可 ...
- MongoDB-6: MongoDB索引
一.简介 在MongoDB建立索引能提高查询效率,只需要扫描索引只存储的这个集合的一小部分,并只把这小部分加载到内存中,效率大大的提高,如果没有建立索引,在查询时,MongoDB必须执行全表扫描,在数 ...
- Django组件 - cookie、session、用户认证组件
一.cookie 1.会话跟踪技术 1)什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话 ...
- MySQL按时间查找
RecentMutations表的结构如图,现在的需求是需要查找到2017年09月08日前10天的变体总数: SQL语句:SELECT SUM(MutantNumber) FROM RecentMut ...
- struts 文件下载 annotation 注解版
[本文简介] 本文将简单介绍使用 struts2 ,通过零配置和 annotation 实现文件下载功能. [文件夹结构] [web.xml有关struts的配置] <filter> &l ...