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的存储方式就是文档存储。 ↩︎

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐