MongoDB数据结构(未完)

MongoDB(未完)

0.前提概要

  1. 首先要明确的是MongoDB是一个Nosql数据库。

1.MongoDb的数据结构

  1. MongoDB的数据以文档为单位,采用Bson的文档结构。
  2. MongoDB的数据必须有_id字段(MongoDB会自动添加)
  3. MongoDB的数据存储方式不属于行存储或者列存储,而是文档存储1
  4. MongoDB的底层使用B-树的数据结构(下面会讲为什么)。
  5. MongoDB是非聚簇索引,这点和Myisam很像(包括创建的单字段索引)
  6. 支持多种索引类型及创建方式,详细可查看官网文档链接

1.1 怎么解释文档存储

​ 我们知道存储结构分为行存储和列存储,市面上常见的关系型数据库大多都是以行存储为存储格式,列如Mysql、Sql Server、Oracle、DB2。在大数据盛行的今天,也出现了很多列存储数据库,列如:Hbase、Click house。甚至于还有混合式存储数据库PostgreSQL等等。

​ 当然也有一些不属于上述两种存储结构的数据库,比如常见的Redis,Redis的存储方式基于各种数据结构。所以基于Nosql这个思路,我们来解释什么是文档存储,文档存储就是把一条数据打上标记_id然后顺序存储在一起。至于如何处理数据的删除和新增我们后面会讲。

1.2怎么解释MongoDB使用B-树

关于MongoDB是B树还是B+树,其实网上众说纷纭。

  1. 引用一个回答mongodb现在用的是wired tiger作为存储引擎,可以在官网看到是用的B+树作为数据结构

这个我在MongoDB的官方文档找到认证,确实在4.2后默认使用WiredTiger引擎,但是在WiredTiger的文档描述中没有到B+树相关的描述,仅仅说是Btree,详情见前面链接。

  1. 在MongoDB的官网描述中MongoDB使用的是B树结构,我们以官网为准。

​ 众所周知!Mysql是使用B+树的数据结构存储数据,这样做的好处,很直观的一点范围查询好做,并且IO次数有保障。

​ 那么为什么MongoDB为什么用B-树(B树,下统称B树):

  1. 回到最初问题MongoDB是Nosql非关系型数据库。
  2. 所以使用MongoDB存储的数据尽量保证是非关系型的。
  3. 举个例子,我们要存储班级和学员的信息。
  4. 我们使用关系型数据库的时候会把班级的ID存储在学员的行信息中。
  5. 但是!但是MongoDB是一个文档数据库。我们的数据就不应该按照ID链接的方式来存储。
  6. 应该用内部嵌套的形式把学员信息变成一个班级信息中的对象,仅存储班级信息即可。

​ 如此,我们在MongoDB存储的时候摒除了关系这个概念,那么在没有关系的时候又是非聚簇索引的情况下,范围查询使用B树是不是也可以做到了,并且数据的存储上限是不是也可以放开了。至于范围查询的速度问题,首先我们明确MongoDB是文档存储,那么我们会有很多场景需要范围查询吗,如果合理设计了文档,其实是可以减少这个操作的,其次因为MongoDB是Bson的存储方式,那么在网络传输这一步的开销就会大大降低。



  1. 逻辑上我们可能会认为MongoDB是行存储,但这是错误的,行存储首先需要的要有一个固定的行,即每一列的列名,固定后再依次添加行数据。但是MongoDB并不是这样,它的一条数据就是一个文档,并且这个文档是可以嵌套层级的,所以这里需要注意,MongoDB的存储方式就是文档存储。 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值