mongodb使用的是B+树
目录
结论:MongoDB3.2之后使用WiredTiger作为引擎,WiredTiger引擎使用B+树作为数据存储结构。
疑问
之前没有深入了解和使用mongodb,看网上有人说mongodb不是使用B+树,所以我们就很好奇mongo索引的数据结构为B-树的话,mongodb是如何实现范围查询的?
比如我们会看到一些这样的标题的文章:
- 【原创】为什么Mongodb索引用B树,而Mysql用B+树? - 孤独烟 - 博客园
- 为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树 - kaleidoscopic - 博客园
- MongoDB 为什么使用B-树而不是B+树?-问答-阿里云开发者社区-阿里云
再结合官网说MongoDB采用B树实现索引,我们很容易误以为MongoDB不是使用B+树实现索引。
[1] MongoDB indexes use a B-tree data structure.
B-树各个节点之间是无指针相连的,是如何实现范围查询的呢?
//查询价格200-9000范围的数据
db.prodgory.find({"price":{$gt:"200",$lt:"9000"}})
各种B树
B-树、B+树我们统称为B树,所以MongoDB官网说使用的是B树,我们还不能下结论说MongoDB没有使用B+树,这里不展开B树细节了。CSDN、掘金、各种社区都有很多正确的好文章。
MongoDB引擎
MongoDb 官网关于存储引擎(Storage Engine)的描述写道:从 MongoDb 3.2 版本开始,其使用了 WiredTiger 作为其默认的存储引擎。
WiredTiger Storage Engine — MongoDB Manual
而在WiredTiger引擎官网上,我们发现:
WiredTiger maintains a table's data in memory using a data structure called a B-Tree ( B+ Tree to be specific), referring to the nodes of a B-Tree as pages. Internal pages carry only keys. The leaf pages store both keys and values.
WiredTiger: Tuning page size and compression
所以WiredTiger 使用的是 B+ 树作为其存储结构,也意味着3.2之后的MongoDB使用的B+树。
那为什么会出现很多文章说MongoDb使用B树或B-树作为存储的数据结构呢?
我们猜可能有两个原因:
- 第一个原因可能是B+树本身是B树的一种优化,所以很多人就直接把 B+ 树说成 B 树了
- 第二个原因可能是 MongoDb 3.2 之前,确实使用 B 树作为存储的数据结构。
参考
Storage Engines — MongoDB Manual