Mongodb 数据存储是 B+ TREE 还是 B TREE

Mongodb 数据存储是 B+ TREE 还是 B TREE_第1张图片

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(接近700人左右 1 + 2)。

前一段被问及MOGNODB 到底是 B+TREE 还是 B TREE ,这个问题根据之前的记忆是 BTREE ,而有同学提出是 B+TREE ,所以这个问题的再次打卡,再次确认,到底是WT 使用的是什么数据存储结构。

实际上一个数据库一个数据引擎的数据存储结构经常与以下提到的部分有关联性

1  数据的整体模型设计

2  数据操作中如何减少延迟

3  增加数据 IN/OUT 的数据操作速率

4   考虑数据的一致性和数据的扩展性

Mongodb 数据存储是 B+ TREE 还是 B TREE_第2张图片

我们熟悉的MYSQL 数据库中的INNODB 引擎使用的是B+TREE 的数据存储方式,这里B+TREE 主要与B TREE 不同的部分在于叶子节点部分中的页面之间的双链,通过这样的方式让MYSQL 在进行一些连续性的数据读取的情况下,从底层叶子节点的双链就可以找到需要读取的数据,而不是从树的根部在读取相关的数据。

Mongodb 数据存储是 B+ TREE 还是 B TREE_第3张图片

Mongodb 数据存储是 B+ TREE 还是 B TREE_第4张图片

经过多方查证MONGODB 的数据存储结构是与MYSQL的数据存储结构不同的,MOGNODB 中的数据存储结构是B TREE 或者称之为 B-TREE。

Mongodb 数据存储是 B+ TREE 还是 B TREE_第5张图片

下面对于MONGODB的数据存储结构我这里统一称之为 B-TREE ,B -TREE 中的 - 不是减号的意思,而是一个连接的符号,这里请注意,没有 B 减树。B树是一个平衡树,他有点近似于我们熟悉的二叉树,而这里与二叉树的区别是,这里的每个节点都可以有自己的多个子节点。

B树的特点可以总结如下

1  所有的键值都分布在树中

2  键值只能出现在一个节点中

3  数据的扫描有可能在非叶子节点结束

4  数据搜索的性能逼近与二分查找法

MYSQL 和 MONGODB 之间的数据存储的结构的区别在于

1  MYSQL的中间节点是不存储数据的,所有的数据都存储在叶子节点中根据此数据查询的结构,数据查询的复杂度为 O(n) = LogN
2 Mongodb的各个节点存储数据,所以数据的查询的复杂度是不固定的与键值所在树中的位置有关,所以查询的复杂度为 O(1)
3  MYSQL 叶子节点之间是连接的,之间间隔的叶子节点可以直接进行访问,对于范围查询是有利的。
4  MONOGDB 中的节点存储的是 键和值,叶子节点之间是不存在直接访问的方式

问题来了,为什么MONGODB 要使用 B-TREE 而不是 B+TREE 的方式来进行数据结构的组织。

MONGODB 不是传统关系型数据库,在MOGNODB 的使用当中主要进行的是JOSN 数据的存储,并且MOGNODB 擅长的查询方式是非范围方式的查询,MYSQL 数据查询中,数据都在叶子节点中,所有的数据访问都需要访问到叶子节点,而MONGODB 中的每个节点都包含数据,所以如果是非范围查询的方式,MONGODB的数据查询方式的访问数据的速度要快于 MYSQL。

所以MONGODB 不擅长的查询也就确定了,大量的范围方式的查询并不是MONGODB 擅长的,从MOGNODB 对于聚合操作的不擅长就有数据结构组织的“功劳”。

同时在MOGNODB 的数据页面中,还有一个问题,就是数据的更新的问题,基于B-TREE的数据存储的方式,如果这个页面中的数据UPDATE 了,那么这个页面中更新的数据已经不能继续容纳在这个页面的情况下,就会产生页面的分裂,在MONGODB中一个新的页面中是需要分配需要被页分裂页面中的数据的一半的数据的,而在基于这个页面的索引也会被迁移到另一个页面中。

所以基于数据结构的问题,MONGODB 在基于B-TREE的有利和缺陷都一目了然,那么解决这个问题的方法,按照传统的数据库的思路就是,collection中的填充因子,而MONGODB 的填充因子是自动进行修正的,这里我们称之为 paddingFactor.

Mongodb 数据存储是 B+ TREE 还是 B TREE_第6张图片

你可能感兴趣的:(mongodb,数据库)