zoukankan      html  css  js  c++  java
  • 最简单方式理解为什么MongoDB索引选择B-树,而 Mysql 选择B+树

    这个问题是我在看视频的时候老师提到的,虽然之前知道他们各自的索引结构但是还没有研究过原因。在网上一搜答案特别多。但是都特别的啰嗦。于是总结了这篇文章。

    一、B-树和B+树的区别

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

    1、B-树

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

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

    (1)多路,非二叉树

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

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

    在这里我们假定都已经了解了B树相关的结构。

    2、B+树

    B+树是B-树的变种

    最核心的特点如下:

    (1)多路非二叉

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

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

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

    从上面我们可以看出最核心的区别主要有俩,一个是数据的保存位置,一个是相邻节点的指向。就是这俩造成了MongoDB和Mysql的差别。为什么呢?

    3、B-树和B+树的区别

    (1)B+树查询时间复杂度固定是logn,B-树查询复杂度最好是 O(1)。

    (2)B+树相邻接点的指针可以大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

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

    (4)注意这个区别相当重要,是基于(1)(2)(3)的,B-树每个节点即保存数据又保存索引,所以磁盘IO的次数很少,B+树只有叶子节点保存,磁盘IO多,但是区间访问比较好。

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

    二、原因解释

    想要解释原因,我们还必须要了解一下MongoDB和Mysql的基本概念。

    1、MongoDB

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

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

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

    2、Mysql

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

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

  • 相关阅读:
    Java中基于线程池的任务调度设计
    Java中数值型,字符型及字符串的相互转换
    Java编程中必备的十种技能
    Java键盘读入方法
    Java中数据类型及运算符的注意事项
    Java抽象类是否可继承实体类
    Java多线程:start(),sleep(),yield(),join()
    Java线程静态在对象缓存中的妙用
    webAPI
    javascript中的作用域和变量提升
  • 原文地址:https://www.cnblogs.com/matengfei123/p/12459911.html
Copyright © 2011-2022 走看看