首页 > 数据库 >MONGODB 磁盘与内存的数据格式是否一致

MONGODB 磁盘与内存的数据格式是否一致

时间:2023-06-19 16:31:33浏览次数:43  
标签:存储 方式 MONGODB 压缩 内存 磁盘 数据格式 数据


MONGODB  磁盘与内存的数据格式是否一致_字段

最近MONGODB 系统中的数据量逐渐变大,联系了开发准备开始进行数据的archive 和  cleanup 事宜。其中运维的同学问我,你存储的数据size 和实际的数据 size 是不一样的,我回答那是mongodb 自带的数据压缩功能。

但后续的问题我模糊了,例如磁盘和内存的数据是否完全一致,压缩的比率是多少,等等。人无完人,我也不是DB 百科全书。不过好在还不是中年油腻大叔,模糊了那就learning 去。

那就直奔主题wiredTiger , wiredTiger 作为MONGODB 的主力存储引擎(3.0以后,当然还有PERCONA 但目前不主流)。

首先我们看看wiredTiger 到底是怎么存储数据的,本身wiredTiger 存储数据的方式有两种, 行模式 和 列模式。而这两种方式都是使用 B+ TREE的方式来进行数据的存储的。

在行模式中,KEY 与 Values 都是 strings 可变的,而如果采用列的方式,key是通过 64BIT的方式记录 Values 和行模式一样。所以行与列的模式中不同的是 key 的存储方式。

这两种存储方式各有优点和缺点

行的方式提取整行数据快,但需要的存储空间大,并且如果某些方面设计不好,消耗的I/O 无论从性能还是尺寸上都比较大。

列式存储则适合提取所需的字段(意思就是最好别一次提取较多的字段,否则没优势),并且存储的值被限制在 8-BITS 这限制值的大小。相关的mongodb的并发控制主要在 transactions , snapshots 和  cache几个位置

MONGODB  磁盘与内存的数据格式是否一致_字段_02

MONGODB中 基本行采用了行模式的方式进行数据的存储,而数据存储中就会牵扯到 mongodb  中的数据压缩

目前行的存储方面支持四种压缩方式

1 键值前缀压缩

2 字段压缩

3 霍夫曼数据编码压缩

4 块压缩

具体四种压缩方式,默认采用的是键值前缀压缩的方式。这主要是根据CPU 磁盘的消耗,压缩,以及算法的复杂度等因素考虑。

首先要确认的是,磁盘存储的数据与在内存中的数据一定是不一样的,要不怎么还有压缩一说。

1

文件系统缓存中的数据与磁盘上的格式相同,包括对数据文件进行任何压缩,MONGODB使用文件系统缓存来减少磁盘I/O。

2

WiredTiger内部缓存中加载的索引具有与磁盘格式不同的数据表示形式,但是仍然可以利用索引前缀压缩来减少RAM的使用。索引前缀压缩从索引字段中去除常见前缀。

3

WiredTiger内部缓存中的收集数据是未压缩的,并且使用与磁盘格式不同的表示形式。

关于压缩比率的问题,其实没有一个具体的固定的比率这和存储的数据是有关的,下面有一个图,这是 percona 的一个 PPT 中曾经提到的压缩的比率还是比较高的

MONGODB  磁盘与内存的数据格式是否一致_缓存_03

所以在设计MONGODB 的时候,不能因为MONGODB 自带压缩功能 snappy,就可以随意的存储数据尤其是KEY 设计的不应该太长。因为在怎样你的数据在内存中是要打回原形的。

当然,面对mongodb 的 过期数据的  archive 还可以找一期来说说

MONGODB  磁盘与内存的数据格式是否一致_字段_04

标签:存储,方式,MONGODB,压缩,内存,磁盘,数据格式,数据
From: https://blog.51cto.com/u_14150796/6515677

相关文章

  • Linux安装MongoDB 4.0.3
    Linux安装MongoDB4.0.3 1.准备CentOS下安装MongoDB官网提供windows、Linux、OSX系统环境下的安装包,这里主要是记录一下在Linux下的安装。首先到官网下载安装包。文中安装的是4.0.3版本的。官网地址:https://www.mongodb.com/下载地址:https://www.mongodb.com/try/download......
  • 如何加载100M的图片却不撑爆内存,一张 100M 的大图,如何预防 OOM?
    还记得当年面试一个面试官问我怎么加载巨图才能不撑爆内存,我没回答上来,他说分片显示,我寻思特么分片能减少内存使用??现在可以打他脸了!内容扩展1.图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理?2.内存中如果加载一张500*500的png高清图片.应该是占用多少......
  • Docker中安装MongoDb
    1.Dockercompose文件version:'3.1'networks:mongo:external:falseservices:mongo-express:image:mongo-expressrestart:alwaysports:-"8081:8081"environment:ME_CONFIG_MONGODB_ENABLE_ADMIN:t......
  • 数组的动态内存分配
     假设我们要为一个字符数组(一个有20个字符的字符串)分配内存,我们可以使用上面实例中的语法来为数组动态地分配内存,如下所示:char*pvalue=NULL;//初始化为null的指针pvalue=newchar[20];//为变量请求内存要删除我们刚才创建的数组,语句如下:delete[]pvalue;//......
  • 如何查看JVM运行的堆内存情况
    《不可不知的7个JDK命令》介绍了些jdk自带的问题排查工具,机器出现CPU飙升的情况,此时就可以借助工具,排查应用端是否存在一些潜在问题。jmap指令可以查看JVM运行的堆内存情况,[test@localhost]>jmap-hUsage:jmap[option]<pid>(toconnecttorunningprocess)......
  • MongoDB常用28条查询语句
    MongoDB常用28条查询语句1查询所有记录db.userInfo.find();相当于:select*fromuserInfo;默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”,但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize=50;......
  • SQL调优:让Java内存分担计算
    作者: 剽悍一小兔我们在工作中,经常会因为一条慢sql调半天。这一节,我给大家介绍一种提升查询效率的思路,那就是让Java内存帮我们分担一些运算。案例还是采用springBoot日记本系统,源码下载地址和教程在文末。先改一个BUG之前遗留了一个BUG需要我们解决,就是在日记的详情页,日记类型没......
  • MongoDB4.0.0 远程连接及用户名密码认证登陆配置
    https://blog.csdn.net/qq_26896281/article/details/81206492参考文章:https://docs.mongodb.com/manual/tutorial/enable-authentication/https://docs.mongodb.com/manual/core/security-built-in-roles/https://blog.csdn.net/Keith003/article/details/80897085一、创建......
  • 【UE数据传输】UE常用数据格式
    一.Json                           未完待续..........
  • Linux 虚拟内存系统
    Linux虚拟内存系统首先,对Linux的虚拟内存系统做一个概述,以了解一个实际的操作系统是如何组织虚拟内存,以及如何处理缺页(pagefault)的。Linux位为每个进程维护了一个单独的虚拟地址空间,形式如下:可以看到,虚拟地址空间可以分为内核虚拟内存空间和用户虚拟内存空间两部分,实际上......