✅为什么MySQL用B+树,MongoDB用B树?

✅为什么MySQL用B+树,MongoDB用B树?

典型回答

Innodb是MySQL的存储引擎,MySQL是一种关系型数据库,而MongoDB是非关系型数据库。关系型和非关系型数据库比较大的区别就是关系型数据库有大量的范围查询,而非关系型数据库基本都是单条查询。

还有一个区别就是,InnoDB引擎下的MySQL的数据是存储在磁盘上的,而MongoDB的数据是存储在内存上的。

MongoDB 是基于磁盘做存储的,它将数据持久化在磁盘上。 但是,为了提高性能,MongoDB 结合了内存映射的方式来加速数据操作。当有查询或操作时,MongoDB 会将频繁访问的数据加载到内存中,这样可以避免频繁访问磁盘,从而提升读取速度。

接着说一下B树和B+树的区别,其实他们的主要区别就在于B+树的叶子节点之间通过双向指针链接进而形成了链表,所以B+树在范围查询时更加高效。

✅什么是B+树,和B树有什么区别?

一般来说,**B+树在磁盘存储和范围查询方面具有较高的效率,**因为B+树在范围查询时可以通过顺序遍历叶子节点来获取连续的数据,从而提高了查询的效率。**而B树更适合内存存储和随机访问的场景,**因为B树的特点是叶子节点和非叶子节点都包含键值和数据信息。这种设计使得B树在内存中的访问更加高效,因为在内存中可以直接访问数据,而不需要再进行一次磁盘访问。

所以说,如果是磁盘查询,一定是B+树效率更高,这是一定的。所以这是MySQL用B+树的原因!

但是如果是内存查询,B树一定就比B+树好吗?虽然他可能会因为非叶子节点上也有数据而减少查询次数,但是B+树相比B树来说,他还有一个同样的数据量情况下,他的高度可能更低的优点呢。。。

所以,在内存查询上,并不能说明B树就一定比B+数的效率要高。

那么,为啥MongoDB还要用B树呢?其实,MongoDB在旧版本中用的确实是B树,但是在 MongoDB 3.2 以后,已经采用 WiredTiger 作为默认的存储引擎了。

WiredTiger的默认的数据结构已经是B+树了 (https://source.wiredtiger.com/10.0.0/tune_page_size_and_comp.html )!