数据库索引从二叉树到B-树再到B+树的演变


    索引是数据库学习过程中必不可少的话题,也是一个尤为重要的概念,索引包括B-树,B+树,Hash树等等,但本文重点讨论B-树和B+树。

1 索引的作用

    索引:在数据表的一个或多个字段上创建的一种数据结构,帮助数据库高效的获取数据。

1.1索引的优势?

1.为表中被请求的数据行提供直接指针;
2.在一些情况下,避免排序操作;
3.避免了对基表所有数据页的访问,直接扫描全索引页和少量数据页。

1.2索引的缺点?

1.索引占物理和数据空间,以存储空间为代价减少I/O。
2.数据的删除、更新和插入操作中会带来额外的索引维护成本,而且索引越多成本越大。

2 索引的实现

    索引的实现和数据库存储引擎相关,不同数据库存储引擎采用的索引方式不同,如MySQL的InnoDB和MyISAM都采用B+ Tree实现,但存储细节上不一样。InnoDBInnoDB也支持hash索引。还有数据库采用堆栈索引等。下文主要讨论B树。

2.1二叉树

    二叉树是最简单的B树,但是二叉树是一种极不稳定的数据结构,根节点的值对树结构影响极大,下图说明两个最主要的问题,1.根节点选择36和9完全呈现出两种不同结构,树结构和链结构。2.即使是图左侧的树结构也是一种不平衡树,比如搜索9需要2次,搜索56需要3次。
在这里插入图片描述
二叉树的四大缺点:

  1. 每个非叶子节点至多两个子树,每个节点存储一个关键字。
  2. 树的搜索深度不一致,搜索稳定性不好,查询效率不稳定。
  3. 同样的关键字集合,根节点的关键字选择不好,树的深度结构差异很大。
  4. 为了让二叉树尽量保持平衡,延伸出“平衡二叉树”,即B树。

2.2B-树

    B-树也称为B树,即Balance的意思,是在二叉树的基础改进,让树的叶结点后保持同样的深度。
    定义:B-树是一种多路搜索树(并不是二叉的):
1.定义任意非叶子结点最多只有M个儿子;且M>2;
2.根结点的儿子数为[2, M];
3.除根结点以外的非叶子结点的儿子数为[M/2, M];
4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
5.非叶子结点的关键字个数=指向儿子的指针个数-1;
6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的
子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
8.所有叶子结点位于同一层;
在这里插入图片描述
从图中可以看出,每个子结点的个数不在仅限于两个,可以根据树的大小调整,最终达到叶子节点B-树的搜索深度相同。

注意:B-树的效果只是达到了叶子结点搜索深度一样,但是对于整体的搜索深度并不一样,比如关键字在非叶子结点的8和叶结点的36就分别搜索一次和两次

每个结点就相当于一个索引页,一条索引记录中包含两点基本信息:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值