所谓搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术。类比下搜索引擎的定义,就是根据一定的算法和数据结构,将数据合理有效的存储在计算机中的一种技术,常见如哈希存储引擎、B树存储引擎、LSM树存储引擎等。
一、概念
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。它由MongoDB Inc.(当时是10gen团队)于2007年10月开发,2009年2月首度推出,现以服务器端公共许可(SSPL)分发。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富、最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。它最大的特点是支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。同关系型数据库MySQL一样,MongoDB也有多种存储引擎以适用于不同的场景,如MMAPv1、WiredTiger、In-Memory等。
二、分类
- MMAPv1
3.2版本之前的默认存储引擎,支持以数据库(<3.0)或集合(3.0)为单位进行锁控制,后来被WiredTiger取代。从4.2版本开始,MongoDB移除了对MMAPv1存储引擎的支持。它将数据库文件映射到内存中,MongoDB总是尽可能的多吃内存,以映射更多的数据文件,并且页面的换入换出基本交给OS控制。当MongoDB重启时,这些映射的内存并不会清除,相对于其它自己维护Cache的数据库,MongoDB在重启后并不需要进行缓存重建与预热。
- WiredTiger
3.0版本中引入,3.2+版本默认存储引擎,支持记录级(document级)锁控制(乐观锁机制)。它使用了二阶缓存(WiredTiger Cache内存中的缓存和File System Cache本地数据文件中的缓存)来保证Disk上的数据的最终一致性。每隔60秒,或当Journal文件超过2GB会有一个叫Checkpoints的事件,WT会把WT Cache中的数据存入FS Cache,然后一次性将所有改变应用到磁盘上。WiredTiger使用预写日志的机制(WAL),在数据更新时先将数据更新写入到日志文件,然后在创建Checkpoint操作开始时将日志文件中记录的操作刷新到数据文件。4.0以前的版本只支持单文档的事务,4.0版本引入了复制集事务,4.2版本引入了分片事务。
- In-Memory
从3.2.6开始MongoDB企业版才支持,它将数据存储在内存中,除了少量的元数据和诊断(Diagnostic)日志,In-Memory存储引擎不会维护任何存储在硬盘上的数据(On-Disk Data),避免Disk的IO操作,减少数据查询的延迟。
查看当前引擎
db.serverStatus()
会输出MongoDB信息,其中:
1 | "storageEngine" : { |
三、对比
关键特性 | MMAPV1引擎 | wiredTiger引擎 |
---|---|---|
默认引擎 | <=3.0版本为MongoDB默认引擎,4.2+废弃 | 3.0版本引入,3.2版本起作为默认引擎 |
数据压缩 | 不支持 | 默认采用 snappy 压缩模式同时支持zlib 压缩模式 |
Journal日志 | 写操作首先在内存进行修改并将对应操作写入磁盘journal文件。如果修改在数据同步至磁盘之前MongoDB崩溃,重启之后MongoDB可以利用journal日志重新应用对应的写操作到数据文件从而保证数据一致性。 | journal日志保存两个检查点之间的所有修改,如果MongoDB在下一个检查点之前崩溃,引擎将会使用journal重放最后一个检查点以来的所有数据修改操作。 |
锁控制 | 数据库和集合级 | 文档级控制 |
事务 | 单个文档操作具备原子性 | MongoDB4.0版本支持多文档事务,4.2引入分布式事务并整合多文档事务 |
CPU | 增加CPU核数对性能的提升有限 | 多核系统中提升CPU核数可很大程度提升性能 |
内存 | 自动使用机器所有空闲内存作为自己的缓存 | 同时使用引擎内部缓存及文件系统缓存 |
数据加密 | 不支持 | 官方企业版支持 |
文档修改 | 善于处理具有大量插入、读取和就地更新的工作场景 | 不支持原地更新,会导致整个文档的重写 |
调优 | 可调优的点极少 | 允许通过不同的参数对引擎进行调优,比如:内部缓存大小、读写并发控制、检查点触发时间间隔等 |