MongoDB(未完)
0.前提概要
- 首先要明确的是MongoDB是一个Nosql数据库。
1.MongoDb的数据结构
1.1 怎么解释文档存储
我们知道存储结构分为行存储和列存储,市面上常见的关系型数据库大多都是以行存储为存储格式,列如Mysql、Sql Server、Oracle、DB2。在大数据盛行的今天,也出现了很多列存储数据库,列如:Hbase、Click house。甚至于还有混合式存储数据库PostgreSQL等等。
当然也有一些不属于上述两种存储结构的数据库,比如常见的Redis,Redis的存储方式基于各种数据结构。所以基于Nosql这个思路,我们来解释什么是文档存储,文档存储就是把一条数据打上标记_id
然后顺序存储在一起。至于如何处理数据的删除和新增我们后面会讲。
1.2怎么解释MongoDB使用B-树
关于MongoDB是B树还是B+树,其实网上众说纷纭。
- 引用一个回答
mongodb现在用的是wired tiger作为存储引擎,可以在官网看到是用的B+树作为数据结构
这个我在MongoDB的官方文档找到认证,确实在4.2后默认使用WiredTiger引擎,但是在WiredTiger的文档描述中没有到B+树相关的描述,仅仅说是Btree,详情见前面链接。
- 在MongoDB的官网描述中MongoDB使用的是B树结构,我们以官网为准。
众所周知!Mysql是使用B+树的数据结构存储数据,这样做的好处,很直观的一点范围查询好做,并且IO次数有保障。
那么为什么MongoDB为什么用B-树(B树,下统称B树):
- 回到最初问题MongoDB是Nosql非关系型数据库。
- 所以使用MongoDB存储的数据尽量保证是非关系型的。
- 举个例子,我们要存储班级和学员的信息。
- 我们使用关系型数据库的时候会把班级的ID存储在学员的行信息中。
- 但是!但是MongoDB是一个文档数据库。我们的数据就不应该按照ID链接的方式来存储。
- 应该用内部嵌套的形式把学员信息变成一个班级信息中的对象,仅存储班级信息即可。
如此,我们在MongoDB存储的时候摒除了关系
这个概念,那么在没有关系的时候又是非聚簇索引的情况下,范围查询使用B树是不是也可以做到了,并且数据的存储上限是不是也可以放开了。至于范围查询的速度问题,首先我们明确MongoDB是文档存储,那么我们会有很多场景需要范围查询吗,如果合理设计了文档,其实是可以减少这个操作的,其次因为MongoDB是Bson的存储方式,那么在网络传输这一步的开销就会大大降低。
逻辑上我们可能会认为MongoDB是行存储,但这是错误的,行存储首先需要的要有一个固定的行,即每一列的列名,固定后再依次添加行数据。但是MongoDB并不是这样,它的一条数据就是一个文档,并且这个文档是可以嵌套层级的,所以这里需要注意,MongoDB的存储方式就是文档存储。 ↩︎