目录

结论:MongoDB3.2之后使用WiredTiger作为引擎,WiredTiger引擎使用B+树作为数据存储结构。

疑问

之前没有深入了解和使用mongodb,看网上有人说mongodb不是使用B+树,所以我们就很好奇mongo索引的数据结构为B-树的话,mongodb是如何实现范围查询的?

比如我们会看到一些这样的标题的文章:

再结合官网说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 树作为存储的数据结构。

参考

Indexes — MongoDB Manual

Storage Engines — MongoDB Manual

WiredTiger Storage Engine — MongoDB Manual

『浅入浅出』MongoDB 和 WiredTiger - 面向信仰编程