MySQL 与 MongoDB 存储差异分析
MySQL 与 MongoDB 存储差异分析:为什么随机生成数据的存储空间不同?
在实际应用中,我们常常需要选择合适的数据库系统来处理不同类型的数据。在这个过程中,数据库的 存储机制 和 性能优化 起着至关重要的作用。对于很多开发者来说,MySQL 和 MongoDB 是常见的选择,它们分别代表了 关系型数据库 和 文档型数据库 的不同存储模型。本文将分析 MySQL 和 MongoDB 在存储上存在的差异,尤其是在相同数据条件下,为什么它们的存储空间会有所不同,特别是 随机生成数据 和 固定生成数据 的存储对比。
背景
在某些情况下,我们可能需要进行性能对比测试,尤其是当我们插入相同数量的数据时,存储空间的使用情况往往是一个关键指标。在我们进行的测试中,发现:
- MySQL 8 存储随机生成和固定生成的数据空间相同,都是 165 MB。
- MongoDB 7 存储随机生成的数据需要 543.46 MB,而存储固定生成的数据仅需 69.78 MB。
这些差异引起了我们的好奇:为什么相同数量、相同结构的数据会在两种数据库中占用不同的存储空间?本文将深入探讨导致这种差异的原因。
数据模型 | 数据量 | MySQL 8 存储需求 | MongoDB 7 存储需求 |
---|---|---|---|
随机生成 | 43,200 | 165 MB | 543.46 MB |
固定生成 | 43,200 | 165 MB | 69.78 MB |
MySQL 的存储机制:固定结构,差异小
行存储与固定表结构
MySQL 使用 InnoDB 存储引擎,它遵循 行存储模型。行存储意味着每条记录(每行数据)是根据 表结构 存储的,数据被存储在连续的块中。表结构在数据库创建时就已经定义好了,其中包含列的类型、索引等信息。因此,无论是 随机生成数据 还是 固定生成数据,只要数据类型和字段顺序保持一致,存储开销是相同的。
-
固定结构:MySQL 的数据表结构是固定的,每条数据的存储空间是根据表的字段数量和类型决定的。这意味着,无论数据内容如何变化,存储方式和空间需求不会发生大变化。
-
索引开销:MySQL 会为表中的数据创建索引来加速查询,而索引的大小与数据内容无关。假设你在两个测试中使用了相同的索引,存储空间差异只会出现在数据行的存储上,且差异非常小。
因此,即使插入的是 随机生成的数据,只要数据字段、类型和表结构相同,MySQL 对于两者的存储需求几乎没有差异。这就是为什么你在 MySQL 中看到 随机生成和固定生成数据占用相同的空间 的原因。
MongoDB 的存储机制:文档存储与灵活性
与 MySQL 的行存储不同,MongoDB 使用的是 文档存储模型,数据以 BSON(Binary JSON) 格式存储。每个文档是一个独立的单元,里面可以包含不同数量的字段、嵌套结构以及数据类型。MongoDB 的存储结构非常灵活,因此,它的存储开销与数据的结构和内容有着直接关系。
随机生成数据占用更多存储空间
在 MongoDB 中,随机生成数据 可能会包含更多的 冗余信息,导致存储空间增加。这些冗余信息主要包括:
-
字段名和类型信息:在 BSON 格式中,每个文档都包含字段名和字段的类型信息。虽然字段的种类和数据类型一致,但随机生成的数据可能会在字段的排列顺序、字段名称的长度等方面有所变化,从而导致 元数据(如字段名)在每个文档中重复存储。
-
压缩效果差:MongoDB 使用 WiredTiger 存储引擎,它支持压缩(如 Snappy 或 zlib)。压缩算法通过消除数据中的冗余来减少存储空间。对于 随机生成的数据,由于文档的灵活性和不规则性,压缩算法难以找到足够的冗余信息来进行有效的压缩。相比之下,固定生成的数据 在结构上具有更多的相似性,压缩算法能够更高效地识别冗余,从而减少存储空间。
-
文档的灵活性带来的开销:MongoDB 允许每个文档具有不同的结构和字段,而这种灵活性对存储空间造成了一定的额外开销。对于 随机生成的数据,每个文档的结构可能不一致,导致 MongoDB 需要为每个文档分配额外的空间来存储元数据。
因此,尽管数据的字段和类型相同,MongoDB 存储 随机生成的数据 需要更多的空间,因为文档模型的灵活性和压缩效果差使得随机数据的存储更加冗余。
固定生成数据存储空间较小
当数据结构固定时,MongoDB 可以更高效地进行压缩。固定生成的数据具有更一致的结构和字段顺序,压缩算法能够识别和去除更多的冗余部分,从而减少存储空间需求。因此,固定生成的数据 在 MongoDB 中通常占用更少的空间。
总结
MySQL
- 固定表结构:MySQL 使用行存储模型,数据表的结构在创建时就已经定义,无论数据是随机生成还是固定生成,只要字段和数据类型一致,存储需求几乎相同。
- 索引一致性:由于 MySQL 的索引大小不受数据内容影响,存储差异非常小。
MongoDB
- 文档存储模型:MongoDB 使用灵活的文档存储,每个文档存储字段名称、类型信息等元数据,这些信息在随机生成数据时可能更加冗余,从而导致存储空间需求更大。
- 压缩效果差:随机生成的数据压缩效果较差,因为文档结构不规则,无法有效识别冗余,导致存储空间占用较多。
- 固定生成数据:由于数据结构一致,MongoDB 对固定生成数据的压缩效果较好,存储空间需求较小。
结论
尽管 MySQL 和 MongoDB 都是非常强大的数据库系统,但它们在数据存储上有本质的差异。MySQL 依赖于固定的表结构和行存储,因此 随机生成和固定生成数据的存储差异很小。而 MongoDB 使用灵活的文档存储格式,随机生成数据的存储空间需求更高,主要是由于文档格式的灵活性和压缩效果的差异。
了解这些存储差异,可以帮助开发者在选择数据库时更好地评估性能和存储需求,尤其是在处理大规模数据和高并发写入时。
相关文章:
MySQL 与 MongoDB 存储差异分析
MySQL 与 MongoDB 存储差异分析:为什么随机生成数据的存储空间不同? 在实际应用中,我们常常需要选择合适的数据库系统来处理不同类型的数据。在这个过程中,数据库的 存储机制 和 性能优化 起着至关重要的作用。对于很多开发者来说…...

【2024】前端学习笔记19-ref和reactive使用
学习笔记 1.ref2.reactive3.总结 1.ref ref是 Vue 3 中用来创建响应式引用的一个函数,通常用于基本数据类型(如字符串、数字、布尔值等)或对象/数组的单一值。 ref特点: ref 可以用来创建单个响应式对象对于 ref 包裹的值&…...
2024.11.26总结
今晚考了个科目四,只准备了半天,考试的时候几乎都是乱选的,选完后就走人了,相当于白白浪费了一次机会。有时候感觉上班太累了,不知道是心累,还是其他方面。 思来想去,还是决定继续在CSDN上输出…...

《通俗易懂 · JSqlParser 解析和构造SQL》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流…...

OSPTrack:一个包含多个生态系统中软件包执行时生成的静态和动态特征的标记数据集,用于识别开源软件中的恶意行为。
2024-11-22 ,由格拉斯哥大学创建的OSPTrack数据集,目的是通过捕获在隔离环境中执行包和库时生成的特征,包括静态和动态特征,来识别开源软件(OSS)中的恶意指标,特别是在源代码访问受限时…...

路由器中继与桥接
一 . 背景 现在的路由器大多数已经开始支持多种网络连接模式,以下将以TP-Link迷你无线路由器为例进行展开介绍。在TP-Link迷你无线路由器上一般有AP(接入点)模式,Router(无线路由)模式,Repeate…...
香橙派--安装RKMPP、x264、libdrm、FFmpeg(支持rkmpp)以及opencv(支持带rkmpp的ffmpeg)(适用于RK3588平台)
1. 安装RKMPP git clone https://github.com/rockchip-linux/mppcd mpp/build/linux/aarch64./make-Makefiles.bashmake -j8sudo make installRKMPP:用于编解码测试,支持RK3588平台。 2. 安装x264 git clone https://code.videolan.org/videolan/x264…...

【spark-spring boot】学习笔记
目录 说明RDD学习RDD介绍RDD案例基于集合创建RDDRDD存入外部文件中 转换算子 操作map 操作说明案例 flatMap操作说明案例 filter 操作说明案例 groupBy 操作说明案例 distinct 操作说明案例 sortBy 操作说明案例 mapToPair 操作说明案例 mapValues操作说明案例 groupByKey操作说…...

【Python】九大经典排序算法:从入门到精通的详解(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序)
文章目录 1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 归并排序(Merge Sort)5. 快速排序(Quick Sort)6. 堆排序&…...

【346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)
1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…...

Jmeter中的测试片段和非测试原件
1)测试片段 1--测试片段 功能特点 重用性:将常用的测试元素组合成一个测试片段,便于在多个线程组中重用。模块化:提高测试计划的模块化程度,使测试计划更易于管理和维护。灵活性:可以通过模块控制器灵活地…...

利用 Jsoup 进行高效 Web 抓取与 HTML 处理
Jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 JQuery 的操作方法来取出和操作数据。 官网:https://jsoup.org/ 中文文档:Jsou…...

【Java】二叉树:数据海洋中灯塔式结构探秘(上)
个人主页 🌹:喜欢做梦 二叉树中有一个树,我们可以猜到他和树有关,那我们先了解一下什么是树,在来了解一下二叉树 一🍝、树型结构 1🍨.什么是树型结构? 树是一种非线性的数据结构&…...
微信小程序 WXS 的概念与基本用法教程
微信小程序 WXS 的概念与基本用法教程 引言 在微信小程序的开发中,WXS(WeiXin Script)是一种特殊的脚本语言,旨在解决小程序在逻辑处理和数据处理上的一些限制。WXS 允许开发者在小程序的 WXML 中嵌入 JavaScript 代码,以便实现更复杂的逻辑处理。本文将深入探讨 WXS 的…...
Vue.js 中 v-bind 和 v-model 的用法与异同
简介 在 Vue.js 中,v-bind 和 v-model 是两个非常常用且强大的指令,它们分别用于动态地绑定属性和实现双向数据绑定。理解这两个指令的用法和区别对于构建 Vue.js 应用至关重要。本文将详细介绍 v-bind 和 v-model 的用法,并探讨它们的异同。…...
K8s的水平自动扩容和缩容HPA
HPA全称是Horizontal Pod Autoscaler,翻译成中文是POD水平自动伸缩,HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容(除了CPU利用率也可以基于其他应程序提供的度量指标custom metrics进行自…...

【AI日记】24.11.26 聚焦 kaggle 比赛
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 1 内容:研究 kaggle 比赛时间:3 小时 核心工作 2 内容:学习 kaggle 比赛 Titanic - Machine Learning from Disaster时间:4 小时备注:这…...

大型语言模型LLM - Finetuning vs Prompting
资料来自台湾大学李宏毅教授机器学课程ML 2023 Spring,如有侵权请通知下架 台大机器学课程ML 2023 Springhttps://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php2023/3/10 课程 機器如何生成文句 内容概要 主要探讨了大型语言模型的两种不同期待及其导致的两类…...

【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024,12月27-29日)
第四届人工智能、机器人和通信国际会议(ICAIRC 2024) 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 重要信息 会议官网:www.icairc.net 三轮截稿时间:2024年11月30日23:59 录…...
【GPT】力量训练是什么,必要吗,有可以替代的方式吗
什么是力量训练? 力量训练是一种通过抵抗力(如重量、阻力带、自身体重等)来刺激肌肉收缩,从而提高肌肉力量、耐力和体积的运动形式。它包括以下常见形式: 自由重量训练:使用哑铃、杠铃、壶铃等。固定器械…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...