文章目录
索引是数据库学习过程中必不可少的话题,也是一个尤为重要的概念,索引包括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次。
二叉树的四大缺点:
- 每个非叶子节点至多两个子树,每个节点存储一个关键字。
- 树的搜索深度不一致,搜索稳定性不好,查询效率不稳定。
- 同样的关键字集合,根节点的关键字选择不好,树的深度结构差异很大。
- 为了让二叉树尽量保持平衡,延伸出“平衡二叉树”,即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就分别搜索一次和两次
每个结点就相当于一个索引页,一条索引记录中包含两点基本信息:
<