当前位置: 首页 > 科技观察

树结构的MongoDb用的是B树还是B+树?

时间:2023-03-18 13:34:48 科技观察

本文转载自微信公众号“陈淑仪”,作者陈淑仪。转载本文请联系陈淑仪公众号。关于B树和B+树,网上有一个经典的问题:为什么MongoDb用的是B树,而MySQL的索引用的是B+树?但是MongoDb真的使用B树吗?通过查阅资料,看了MongoDb官网和WiredTiger官网找到了答案。MongoDb官网对存储引擎(StorageEngine)的描述是:从MongoDb3.2版本开始,默认使用WiredTiger作为存储引擎。文档地址:WiredTigerStorageEngine—MongoDBManual从WiredTiger官网的文档可以知道,WiredTiger使用的是B+树作为存储结构。文档地址:WiredTiger:Tuningpagesizeandcompression那为什么有很多资料说MongoDb使用B-tree作为存储数据结构呢?我觉得可能有两个原因:一个原因可能是B+Tree本身就是对B-tree的优化,所以很多人直接把B+tree称为B树。另一个原因可能是在MongoDb3.2之前,B树确实被用作存储数据结构。由于这两个原因,我没有深入探讨。有答案的朋友可以留言讨论。但我知道,无论是什么原因,都不会影响我们对这个问题的讨论。表面上是在讨论MongoDb和MySQL存储的数据结构,实际上是在讨论B-tree和B+-tree这两种数据结构的特点。所以,不管MongoDb用的是B树还是B+树。只要搞清楚B-tree和B+-tree的区别,我们就可以在合适的时候选择合适的数据结构。B-tree和B+树最大的特点是:B-tree查询特定记录的时间复杂度较低。B+树更方便范围查询,B+树比B树更扁平。对于MongoDb来说,它是一个非关系型数据库,不太可能对联表做范围查询。如果这确实是MongoDb一个非常典型的使用场景的话,使用B-trees其实可以加快它的查询速度。但实际上,在MongoDb3.2之后,它使用B+树作为它的数据结构。B+树在范围查询方面更有优势。可能是B+树比较扁平,这使得它可以更快地找到数据,加快它的搜索速度。也有可能是MongoDb的范围查询特性被更广泛地使用。说到这里大家可能有点懵,那么实际情况是怎样的呢?其实,我自己也没有找到答案。我的想法到目前为止,我还没有找到更好的答案。与其胎死腹中,还不如写下来和大家一起讨论。也许过不了多久,我就会恍然大悟,到时候分享给大家。在我写这篇文章的时候,另一个问题突然出现在我的脑海中:为什么MongoDb使用B+树?而不是使用平衡二叉树?嗯,答案其实很简单——就是因为需要利用B树可以加载大量数据的特性,否则实际上是不可能对如此大量的数据进行查询和排序的。