当前位置: 首页 > news >正文

MongoDB~存储引擎了解

存储引擎

存储引擎是一个数据库的核心,主要负责内存、磁盘里数据的管理和维护。

MongoBD的优势,在于其数据模型定义的灵活性、以及可拓展性。但不要忽略,其存储引擎也是插件式的存在,支持不同类型的存储引擎,使用不同的引擎可以解决不同场景的问题,也支持用户去自定义实现存储引擎。

在设计之初,为了实现server与物理存储的解耦,引入存储引擎作为中间插件,类似于MySQL的:基于B+Tree的InnoDB引擎和基于LSM树的RocketsDB引擎,还有快速写入和读取的MyISAM引擎。

目前MongoDB主要有俩种引擎

  • WiredTiger 存储引擎:默认的存储引擎为 WiredTiger 存储引擎,非常适合大多数工作负载,建议用于新部署。WiredTiger 提供文档级并发模型、检查点和数据压缩等功能。
  • In-Memory 存储引擎:In-Memory 存储引擎在 MongoDB Enterprise 中可用。它不是将文档存储在磁盘上,而是将它们保留在内存中以获得更可预测的数据延迟。

此外,MongoDB 3.0 提供了 可插拔的存储引擎 API ,允许第三方为 MongoDB 开发存储引擎,这点和 MySQL 也比较类似。

WiredTiger

目前世面上主流的存储引擎大多是基于B+Tree或者LSM Tree实现,类似LevelDB、RocketsDB,都是基于的LSM树。

但WiredTiger引擎与InnoDB一样,使用了B+树作为索引存储结构。
此外,WiredTiger 还支持 LSM(Log Structured Merge) 树作为存储结构,MongoDB 在使用 WiredTiger 作为存储引擎时,默认使用的是 B+ 树。

MongoDB在3.2之前是B树,之后默认WiredTiger引擎后,便一直是B+树

使用 B+ 树时,WiredTiger 以 page 为基本单位往磁盘读写数据。
B+ 树的每个节点为一个 page,共有三种类型的 page:

  • root page(根节点):B+ 树的根节点。
  • internal page(内部节点):不实际存储数据的中间索引节点。
  • leaf page(叶子节点):真正存储数据的叶子节点,包含一个页头(page header)、块头(block header)和真正的数据(key/value),其中页头定义了页的类型、页中实际载荷数据的大小、页中记录条数等信息;块头定义了此页的 checksum、块在磁盘上的寻址位置等信息。
    在这里插入图片描述
    借助 WiredTiger,MongoDB 支持所有集合和索引的压缩。压缩可以最大限度地减少存储使用,但需要额外的 CPU。

In-Memory

从 MongoDB Enterprise 版本 3.2.6 开始,内存存储引擎是 64 位版本中通用可用性 (GA) 的一部分。除了一些元数据和诊断数据外,内存存储引擎不维护任何磁盘数据,包括配置数据、索引、用户凭据等。

内存存储引擎是非持久性的,不会将数据写入持久性存储。非持久性数据包括应用程序数据和系统数据,例如用户、权限、索引、副本集配置、分片集群配置等。

因此,日志或等待数据 持久化的概念不适用于内存存储引擎。
所以一般不会使用该引擎,其丢数据风险比较高。内存存储引擎在进程关闭后不会保留数据。
但通过避免磁盘 I/O,内存存储引擎可以实现更可预测的数据库操作延迟。

要选择内存存储引擎,请指定:

  • inMemory对于–storageEngine选项,或者 storage.engine如果使用配置文件则进行设置。
  • –dbpath,或者storage.dbPath使用配置文件。虽然内存存储引擎不会将数据写入文件系统,但它会维护–dbpath小型元数据文件和诊断数据以及用于构建大型索引的临时文件。
mongod --storageEngine inMemory --dbpath <path>

相关文章:

  • C/C++|回调函数的正确打开方式
  • go-gin中session实现redis前缀和db库选择+单点登录
  • 攻防实战 | 邮件高级威胁检测与自动化响应
  • 【原创】springboot+mysql医院预约挂号管理系统设计与实现
  • EXCEL数据透视图中的日期字段,怎样自动分出年、季度、月的功能?
  • 匠心独运,B 端系统 UI 演绎华章之美
  • springboot 的yaml配置文件加密
  • React 为什么使用map来渲染列表 而不是其他循环方法
  • Docker 的基本概念和优势
  • 遗传算法(GA)
  • Python怎么使用 SQLAlchemy 和model 查询数据呢?
  • SpringCloud如何实现SSO单点登录?
  • 计算机网络期末复习(1)计算机网络在信息时代对的作用 计算机网络的定义和分类 三种交换方法
  • STM32学习问题总结(2)—CubeMX生成项目后串口没效果和Microlib
  • Java Apache Jaccard文本相似度匹配初体验
  • 2017 年终总结 —— 在路上
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java编程基础24——递归练习
  • k8s如何管理Pod
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Promise初体验
  • sessionStorage和localStorage
  • spring学习第二天
  • 从0到1:PostCSS 插件开发最佳实践
  • 区块链分支循环
  • 使用common-codec进行md5加密
  • 说说动画卡顿的解决方案
  • 微信小程序--------语音识别(前端自己也能玩)
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 一个项目push到多个远程Git仓库
  • 正则表达式-基础知识Review
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • %check_box% in rails :coditions={:has_many , :through}
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)Nginx简介和安装教程
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (力扣)循环队列的实现与详解(C语言)
  • (六)软件测试分工
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)VirtualBox安装增强功能
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)程序员技术练级攻略
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net CHARTING图表控件下载地址
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 服务 ServiceController
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境