从MongoDB 3.2 版本开始,WiredTiger成为MongDB默认的Storage Engine,用于将数据长久化存储到硬盘文件中,WiredTiger提供文档级别(Document-Level)的并发管制,检查点(CheckPoint),数据压缩和本地数据加密( Native Encryption)等性能。

个性

1. checkpoint

Checkpoint操作开始时,WiredTiger提供指定工夫点(point-in-time)的数据库快照(Snapshot),该Snapshot出现的是内存中数据的一致性视图。当向Disk写入数据时,WiredTiger将Snapshot中的所有数据以一致性形式写入到数据文件(Disk Files)中。一旦Checkpoint创立胜利,WiredTiger保障数据文件和内存数据是一致性的,因而,Checkpoint担当的是还原点(Recovery Point),Checkpoint操作可能缩短MongoDB从Journal日志文件还原数据的工夫。

当WiredTiger创立Checkpoint时,MongoDB将数据刷新到数据文件(Disk Files)中,在默认状况下,WiredTiger创立Checkpoint的工夫距离是60s,或产生2GB的Journal文件。在WiredTiger创立新的Checkpoint期间,上一个Checkpoint依然是无效的,这意味着,即便MongoDB在创立新的Checkpoint期间遭逢到谬误而异样终止运行,只有重启,MongoDB就能从上一个无效的Checkpoint开始还原数据。

如果要还原在上一个Checkpoint之后执行的批改操作,必须应用Journal日志文件

2. 预写日志journal

Journal 是程序写入的日志文件,用于记录上一个Checkpoint之后产生的数据更新,可能将数据库从零碎异样终止事件中还原到一个无效的状态。在数据更新时,先将数据更新写入到journal文件。journal文件会首先写入内存中。所有不超过128kb的日志记录都被缓存。当满足以下条件时,journal会被刷入到磁盘中:

- 每100ms- 写操作时加了选项`{j:true}`- 达到创立新的journal文件的阈值(100mb)

应用Journal日志文件还原的过程

WiredTiger创立Checkpoint,可能将MongoDB数据库还原到上一个CheckPoint创立时的一致性状态,如果MongoDB在上一个Checkpoint之后异样终止,必须应用Journal日志文件,重做从上一个Checkpoint之后产生的数据更新操作,将数据还原到Journal记录的一致性状态,应用Journal日志还原的过程是:
1 获取上一个Checkpoint创立的标识值:从数据文件(Data Files)中查找上一个Checkpoint产生的标识值(Identifier);
2 依据标识值匹配日志记录:从Journal Files 中搜寻日志记录(Record),查找匹配上一个Checkpoint的标识值的日志记录;
3 重做日志记录:重做从上一个Checkpoint之后,记录在Journal Files中的所有日志记录;

3.存储构造

数据存储

内存page以B+树的构造组织,每个节点为一个page,root page是btree的根节点,internal page是btree的两头索引节点,leaf page是真正存储数据的叶子节点;btree的数据以page为单位按需从磁盘加载或写入磁盘。

Wiredtiger采纳Copy on write(快照)的形式治理批改操作(insert、update、delete),批改操作会先缓存在cache里,checkpoint时,会产生一个新的root page,此时对页面的批改会新调配索引page和数据page。原来的B+树结构理论成为一个快照,由后盾线程执行checkpoint

索引存储

Mongo在索引上也辨别为主键索引和非主键索引,这方面与Mysql的聚簇索引和二级索引相似,主键索引贮存主键以及数据内容,非主键索引贮存索引列数据以及主键。

  • 搜寻从根节点开始,因为B树所有节点都会负责数据存储的工作。所以搜寻的工夫复杂度和数据在构造中的地位强相干,最好的状态是数据在根节点中就搜寻到了,能够间接返回,工夫复杂度是O(1)。即从均匀搜寻速度来看MongoDB查问速度会比Mysql更快
  • 单纯从存储构造上看,数据的存储散布在各个节点,因而如果须要对数据进行遍历,则须要对整个树进行数据的读取。然而从整体的角度层面来看,MongoDB的数据是结构化存储,所有的数据都能够以聚合的形式进行存储,对于数据的遍历需要并没有关系型数据库那么高。在数据的存储底层,Mongo应用的也是BSON(Binary Json)进行存储,在类型反对和网络传输效率上相较于Json也有了很大的晋升。

MongoDB是一种面向文档的数据库管理系统,与传统关系型数据库譬如Mysql不同的是Mysql的数据是扁平化的,构建结构化的数据往往须要通过连表查问在业务中进行组合。而MongoDB是面向文档的数据库,数据在存储阶段就是结构化的,聚合的。即一个文档外部就蕴含了其相关联的子结构

空间局部性原理:如果一个存储器的某个地位被拜访,那么将它左近的地位也会被拜访。
B+树叶节点两两相连可大大增加区间拜访性,可应用在范畴查问等,而B-树每个节点 key 和 data 在一起,则无奈区间查找。

B+树能够很好的利用局部性原理,若咱们拜访节点 key为 50,则 key 为 55、60、62 的节点未来也可能被拜访,咱们能够利用磁盘预读原理提前将这些数据读入内存,缩小了磁盘 IO 的次数。 
当然B+树也可能很好的实现范畴查问。比方查问 key 值在 50-70 之间的节点。