美文网首页面试精选
为什么 MongoDB 索引选择B树,而 Mysql 索引选择B

为什么 MongoDB 索引选择B树,而 Mysql 索引选择B

作者: 愚公要移山 | 来源:发表于2020-12-26 10:53 被阅读0次

    本文献给准备面试或者是还在面试的你。常见面试题,送分题目,不拿白不拿。

    本文收录在个人博客《愚公要移山》中,地址 www.javachat.cc

    这篇是修改版,针对知乎上很多人提出的问题,进行了一次修复

    一、B树和B+树的区别

    很明显,我们想向弄清楚原因就要知道B树和B+树的区别。为了不长篇大论。我们直接给出他们的形式总结他们的特点。

    1、B树

    B树是一种自平衡的搜索树,形式很简单:

    image

    这就是一颗B-树。针对我们这个问题的最核心的特点如下:

    (1)多路,非二叉树

    (2)每个节点既保存索引,又保存数据

    (3)搜索时相当于二分查找

    其他的基本上都是一些常见的数据结构,假定都已经了解了B树相关的结构。

    2、B+树

    B+树是B树的变种

    image

    最核心的特点如下:

    (1)多路非二叉

    (2)只有叶子节点保存数据

    (3)搜索时相当于二分查找

    (4)增加了相邻接点的指向指针。

    从上面我们可以看出最核心的区别主要有俩,

    一个是数据的保存位置:B树保存在所有的节点中,B+树保存在叶子节点

    一个是相邻节点的指向:B树叶子节点之间没有指针,B+树有

    这里区别分别给B树和B+树带来了什么好处呢?其实对于数据库来说,选用什么数据结构无非就是为了增删改查和存储更加高效,因为找特点时也要从这个点去回答。

    3、从区别找特点

    第一:查找元素

    (1)B树的数据保存在所有节点,查询复杂度最好是 O(1)。

    (2)B+树的数据保存在叶子节点,查询时间复杂度固定是O(log(n))

    第二:区间查找

    (1)B树每个节点 key 和 data 在一起,则无法区间查找。

    (2)B+树相邻接点的指针可以大大增加区间访问性,可使用在范围查询等

    第三:存储

    (1)B树每个节点即保存数据又保存索引,所以每一节点特别大,这一层所有节点加起来数据量将非常大。磁盘每次IO一定量的数据,对于Mysql来说如何衡量查询效率呢?就是磁盘IO次数。既然B树每一层特别大,那每一层就需要对数据分开从而进行多次IO操作。所有Mysql不用。

    (2)B+树更适合外部存储,也就是磁盘存储。由于内节点无 data 域,每个节点能索引的范围更大更精确,所以不需要用B+树。

    有了他们的区别之后,现在我们再来解释这个原因就好多了。

    二、原因解释

    上面解释了不使用的原因,我们再来看为什么Mysql使用B+树,而MongoDB使用B树,想要解释原因,我们还必须要了解一下MongoDB和Mysql的基本概念。

    1、MongoDB

    MongoDB 是文档型的数据库,是一种 nosql,它使用类 Json 格式保存数据。比如之前我们的表可能有用户表、订单表、购物篮表等等,还要建立他们之间的外键关联关系。但是类Json就不一样了。

    image

    我们可以看到这种形式更简单,通俗易懂。那为什么 MongoDB 使用B-树呢?

    MongoDB使用B树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql

    2、Mysql

    Mysql作为一个关系型数据库,数据的关联性是非常强的,区间访问是常见的一种情况,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。

    还有一点,B+树只有叶子节点保存数据,所以每一节点比较小,每一层所有节点加起来数据量也相对比较小。磁盘每次IO一定量的数据,对于Mysql来说。既然B+树每一层小,那每一层只需要少量IO操作。

    这俩区别的核心如果你能看懂B-树和B+树的区别就很容易理解。

    回复关键字获取java相关5T资源,

    视频,电子书,面试,简历,IDEA破解等

    只有你想不到的,没有找不到

    相关文章

      网友评论

        本文标题:为什么 MongoDB 索引选择B树,而 Mysql 索引选择B

        本文链接:https://www.haomeiwen.com/subject/lrawnktx.html