为什么有关MongoDB采用B树索引,以及Mysql B+树做索引?

MySQL 中的许多概念在 MongoDB 中具有相近的类比。下表是一些常见概念:

MySQLMongoDB
库 Database库 Database
表 Table集合 Collection
行 Row文档 Document
列 Column字段 Field
joins嵌入文档或者链接

 

1、B-树

        其中 B 是 balance( 平衡的意思)的缩写,B-树是一种多路自平衡的搜索树 。它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。它实现了以 O(lg⁡n) 时间复杂度执行查找、顺序读取、插入和删除操作。由于 B 树和 B 树的变种在降低磁盘 I/O 操作次数方面表现优异,所以经常用于设计文件系统和数据库。

        对于m阶B树的特征如下:

  • 树中每个节点最多含有m个孩子(m>=2)。
  • 除根节点和叶子节点之外,其他每个节点至少含有[ceil(m/2)]个孩子。
  • 若根节点不是叶子节点,则至少含有2个孩子。
  • 所有叶子节点都出现在同一层,叶子节点不包含任何关键字信息(可看做是外部节点或查询失败的节点,实际上这些节点是不存在的,指向这些节点的指针为null)。
  • 有j个孩子的非叶子节点恰好含有j-1个关键字,关键字按照递增的顺序排列。

2、B+树

B+树是为磁盘及其他存储辅助设备而设计一种平衡查找树(不是二叉树)。B+树中,所有记录的节点按大小顺序存放在同一层的叶节点中,各叶节点用指针进行连接。

数据库中B+树索引分为聚集索引(clustered index)和非聚集索引(secondary index).这两种索引的共同点是内部都是B+树,高度都是平衡的,叶节点存放着所有数据。不同点是叶节点是否存放着一整行数据。

       B+树的特点如下:

  • 除根节点之外的内部节点,每个节点最多含有m个关键字,至少含有m/2个关键字,其中,每个关键字对应一个孩子子树。
  • 根节点要么没有子树,要么至少含有2个子树
  • 所有的叶子节点包含了所有的关键字,以及这些关键字指向文件的指针,并且:

             ① 所有叶子节点中的关键字按照从小到大的顺序排列。

             ② 相邻的叶子节点顺序连接(相当于构成了一个顺序链表)。

             ③ 所有叶子节点在同一层。

  • 所有的分支节点的关键字都是对应子树中关键字的最大值。

B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。

3、MongoDB 为什么使用B-树?

B+树内节点不存储数据,所有 data 存储在叶节点导致查询时间复杂度固定为 log n。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)

我们说过,尽可能少的磁盘 IO 是提高性能的有效手段。MongoDB 是聚合型数据库,而 B-树恰好 key 和 data 域聚合在一起

至于MongoDB为什么使用B-树而不是B+树,可以从它的设计角度来考虑,它并不是传统的关系性数据库,而是以Json格式作为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,上面所述的优点2需求就没那么强烈了,其次Mysql由于使用B+树,数据都在叶节点上,每次查询都需要访问到叶节点,而MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql

4、为什么 Mysql 使用B+树

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

 

参考:

        Mysql InnoDB B+树索引和哈希索引的区别? MongoDB 为什么使用B-树?

        为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树

        MongoDB 及 Mysql 背后的 B/B+树

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值