为什么 MongoDB 选择B树,Mysql 选择B+树?

为什么 MongoDB 选择B树,MySQL选择B+树?

   我们知道,Mongodb索引使用B树而MySQL使用B+树。那么这两者的区别是什么?

   注意:这里的Mysql指的是Innodb的存储引擎下的索引结构,其他存储引擎暂不考虑。

   一、B树

   具体结构:

   

   B树单一节点拥有的最多子节点数量,称为B树的“阶”。一个m阶的B树,具有如下几个特征:

   1)根节点至少有两个子节点

   2)每个中间节点都包含k-1个元素(也被称为关键字)和k个孩子,其中m/2<=k<=m

   3)每一个叶子节点都包含k-1个元素,其中m/2<=k<=m

   4)所有的叶子节点都位于同一层

   5)每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分。

   总结:

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

   2)搜索时相当于二分查找

   二、B+树

   具体结构:

   

   B+树是B树的升级版,它和B树有一些共同点,但也具备一些新的特征。

   一个m阶的B+树具有如下几个特征:

   1)有k个子树的中间节点包含k个元素(B树中是k-1个元素),每个元素不保存数据,所有数据都保存在叶子节点

   2)所有的叶子节点包含了全部元素,依照元素的大小升序排列,叶子节点之间用双向指针连接。

   3)所有中间节点的元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

   总结:

   1)只有叶子节点保存数据

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

   4)增加了相邻叶子节点的双向指针

   三、B+树和B树的区别

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

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

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

   四、Mongodb与MySQL索引的区别

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

   1.  查找元素

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

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

   2.  区间查找

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

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

   3.  存储角度

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

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

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

   、使用原因

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

   1. MongoDB

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

 1 // Customer
 2 {
 3     "id": 1,
 4     "name": "Tom Benzamin",
 5     "billingAddress": [{"city":"china"}]
 6 }
 7 
 8 // Orders
 9 {
10     "id": 99,
11     "orderItem": {
12         "productId": 27,
13         "price": 100,
14         "productName": "book"
15     },
16    "shippingAddress": [{"city":"china"}],
17     "orderPayment": [
18          ...
19     ],
20 }

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

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

   2. Mysql

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

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

 

   参考链接:https://www.163.com/dy/article/FUSD0CKN0521POUF.html

posted @ 2021-07-12 19:28  欢乐豆123  阅读(209)  评论(0编辑  收藏  举报