栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

B树和B+树

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

B树和B+树

1.什么是B树

B树是是二叉树上进行优化的多叉树,因为随着我们数据的增加。二插树它的树高也会越高,每次查询都需要访问过多节点(MySQL的InnoDB存储引擎中,他一次IO读取的数据量大小是16K,而二叉树每次只读取一个节点数据(大约16个字节,占用千分之一),大大消耗浪费读取内存),即访问数据块过多,而从磁盘随机读取数据块过于耗时。所以我们需要减少磁盘的读取,减少IO次数。

比如一棵 100 万节点的平衡二叉树,树高 20。一次查询可能需要访问 20 个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。也就是说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms的时间,这个查询可真够慢的。

B树有以下特点

1.每个结点最多有m-1个关键字。
2.根结点最少可以只有1个关键字。
3.非根结点至少有Math.ceil(m/2)-1个关键字。
4.每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
5.所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。

以下是一个3阶B树

可以发现根他的树高是2,有3个叶子节点,每个叶子节点存储2条数据。
在我们MySQL的InnoDB存储引擎中,他一次IO读取的数据量大小是16K,比如我们一条数据有两个指针和一个key,指针是(P1,P2)Key是比如是值(0010),他们占用内存是16字节,所以我们一个磁盘块可以存储的数据就是1000条。
如图所示,如果我们根节点有1000条索引,在理想情况下那么我们就有1001个叶子节点,每个叶子节点有1000条数据。达到百万级数据的话,我们的树高可能是2。在百万级数据查询中,我们只需要2次IO读取就可以查询到相应的数据,它可以大大加快我们的查询次数。
B树的缺点

1.在B树当中,每个节点都会存储数据data,如果每个data存储的都是行数据,那么我们占用的数据内存会大大增加,树高也会变高。会增加我们的IO读取次数。
2. B树他部支持范围查询,比如上述我们查询5到15的数据。当查询到8之后,我们还需要回的根节点在进行查询,会增加我们的IO读取次数。

2.什么是B+树

B+树,作为B树的升级版,在B树基础上,MySQL在B树的基础上继续改造,使用B+树构建索引。B+树和B树最主要的区别在于非叶子节点是否存储数据的问题

1.B+树包含2种类型的结点:内部结点(也称索引结点)和叶子结点。根结点本身即可以是内部结点,也可以是叶子结点。根结点的关键字个数最少可以只有1个。

2.B+树与B树最大的不同是内部结点不保存数据,只用于索引,所有数据(或者说记录)都保存在叶子结点中。

3.m阶B+树表示了内部结点最多有m-1个关键字(或者说内部结点最多有m个子树),阶数m同时限制了叶子结点最多存储m-1个记录。

4.内部结点中的key都按照从小到大的顺序排列,对于内部结点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于它。叶子结点中的记录也按照key的大小排列。

5.每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接。

如图是一个B+树,磁盘块1,磁盘块2,磁盘块3是非叶子节点,存储的都是键值。
磁盘块4,磁盘块5,磁盘块6,磁盘块7,磁盘块8,磁盘块9是叶子节点存储的数据data,和一个双向链表。

1.其实这样看,B+树每次查询数据都需要到叶子也点去找数据,和B树比起来还是会感觉有点欠缺。但是B树他的叶子节点和非叶子节点都会存储数据data,当我们data比较占内存时,相对来说B树的高度会比B+树高。
2.B+树支持范围查询,因为B+树的叶子节点是一个双向有序列表,每个磁盘块会通过一个指针想联,当我们查询5到10的数据时。直需要通过查询到磁盘块4,在查询磁盘块5即可。不需要返回到上一节点或者根节点。

B树:非叶子节点和叶子节点都会存储数据。
B+树:只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1039516.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号