树结构之MongoDb 使用的到底是 B 树,还是 B+ 树?

运维 数据库运维 MongoDB
关于 B 树与 B+ 树,网上有一个比较经典的问题:为什么 MongoDb 使用 B 树,而 MySQL 索引使用 B+ 树?

 [[393997]]

本文转载自微信公众号「陈树义」,作者陈树义。转载本文请联系陈树义公众号。

关于 B 树与 B+ 树,网上有一个比较经典的问题:为什么 MongoDb 使用 B 树,而 MySQL 索引使用 B+ 树?

但实际上 MongoDb 真的用的是 B 树吗?

通过查阅资料,我从 MongoDb 的官网和 WiredTiger 官网找到了答案。MongoDb 官网关于存储引擎(Storage Engine)的描述写道:从 MongoDb 3.2 版本开始,其使用了 WiredTiger 作为其默认的存储引擎。

文档地址:WiredTiger Storage Engine — MongoDB Manual

而从 WiredTiger 官网文档,我们可以知道:WiredTiger 使用的是 B+ 树作为其存储结构。

文档地址:WiredTiger: Tuning page size and compression

那为什么会出现很多资料说 MongoDb 使用 B 树作为存储的数据结构呢?我想可能有两个原因:一个原因可能是 B+ Tree 本身是 B 树的一种优化,所以很多人就直接把 B+ 树说成 B 树了。另一个原因可能是 MongoDb 3.2 之前,确实使用 B 树作为存储的数据结构。

对于这两个原因,我没有深入去探寻,有答案的朋友可以留言讨论一下。但我知道,无论是什么原因,都不影响我们对这个问题的讨论。表面上,我们是在讨论 MongoDb 与 MySQL 存储的数据结构,但实际上我们是在讨论 B 树和 B+ 树这两种数据结构的特点。

因此,无论 MongoDb 使用的是 B 树,还是 B+ 树。只要我们弄清楚 B 树与 B+ 树之间的区别,我们就可以在合适的时候,选择合适的数据结构。

B 树与 B+ 树,其比较大的特点是:B 树对于特定记录的查询,其时间复杂度更低。而 B+ 树对于范围查询则更加方便,另外 B+ 树相对于 B 树来说更加扁平。

对于 MongoDb 来说,其是非关系型数据库,较少做联表的范围查询。如果这确实是 MongoDb 非常典型的使用场景,使用 B 树其实可以加快其查询速度。

但实际上 MongoDb 3.2 之后,其使用了 B+ 树作为其数据结构。B+ 树其在范围查询方面更有优势,那有可能是 B+ 树更加扁平,可以让其更加快速地找到数据,加快其查找速度。也有可能是 MongoDb 的范围查询特性使用更加广泛了。

说到这里,你可能有点迷糊,那实际情况到底是什么呢?

其实我自己并没有找到答案。我的思考也是到此为止,我也并没有找到更好的答案。与其腹死胎中,还不如写下来与大家讨论。或许不久之后我就忽然大悟,明白这其中的道理,到时候再来给大家分享。

写到这里,脑袋里蹦出另外一个问题:那为啥 MongoDb 要使用 B+ 树 ?而不使用平衡二叉树?嗯,答案其实很简单——是因为需要使用 B 树能加载大数据量的特性,否则其实现不了这么大量数据的查询和排序。

 

责任编辑:武晓燕 来源: 陈树义
相关推荐

2020-04-01 18:08:57

MySQL B-树B+树

2019-08-29 10:46:22

MySQL索引数据库

2019-01-29 19:43:10

MySQL索引数据库

2021-05-19 09:51:31

MySQL-B+树数据

2020-02-12 19:01:22

索引B-树B+树

2019-09-24 09:33:53

MySQLB+树InnoDB

2019-12-31 09:33:03

MongoDBB 树NoSQL

2023-08-29 08:31:13

B+树数据索引

2022-03-28 08:24:52

MySQL聚簇索引非聚簇索引

2023-07-31 09:12:39

B+树节点B+Tree

2021-02-16 16:38:41

MySQLB+树索引

2020-03-30 17:20:54

B+树SQL索引

2015-04-21 13:09:01

B+树MySQL索引结构

2019-11-26 15:12:08

数据存储B+树

2019-09-19 14:03:32

B树节点数据结构

2021-12-14 17:19:15

存储数据

2022-04-16 14:20:29

MySQL数据库

2023-11-28 16:17:20

数据库MySQL

2021-06-02 10:23:06

索引B+树数据

2020-03-19 07:53:56

Mysql引擎B+树
点赞
收藏

51CTO技术栈公众号