B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
2013-12-19 23:24
931 查看
B树是为磁盘存储而专门设计的一类平衡搜索树,B树的高度仅随着它所包含的节点数按对数增长,不过因为单个节点可以包含多个关键字,所以对数的底数可以比较大,实际应用中一般是50~2000,给个直观的数字,一棵分支因子为1001、高度为2(不包含根节点)的B树,可以存储超过10亿个关键字!
1.从磁盘结构讲起
计算机的机械磁盘,为了摊还机械移动花费的等待时间,磁盘会一次存取多个数据项而不是一个,这样的一次读取的信息单元是page,我们可以用读或写的页数作为磁盘存取总时间的主要近似值,在任何时刻,B树算法都只需在内存中保持一定数量的页面。B树的设计考虑磁盘预读取这点,一个B树的节点通常和一个完整磁盘页(page)一样大,并且磁盘页的大小限制了一个B树节点可以含有的孩子个数(分支因子),当然这个具体也需要取决于一个关键字相对一页的大小。B+ Tree中内部节点只存放关键字和孩子的指针,不存其他satellite information,因此最大化了内部节点的分支因子。2.B树的数据结构
typedef int KeyType; #define m 3 struct Node{ int keynum; /* 结点中关键字的个数,即结点的大小*/ struct Node *parent; /*指向parent结点*/ KeyType key[m]; /*关键字向量*/ struct Node *ptr[m]; /*子树指针向量*/ };
3.B树的查找
搜索一棵B树和搜索一棵二叉搜索树很相似,只是在每个节点所做的不是二叉或者“两路”分支选择,而是根据根节点的孩子数做多路分支选择。4.B树的插入
B树插入的时候都是插入到叶节点上,插入的时候会从根节点开始顺着叶节点的方向沿途,如果遇到一个满节点(该节点上的关键字达到2t-1,t代表t阶B树),就会split该节点,分裂节点方式就是把满节点上的中间关键字往根节点方向提,分裂是树长高的唯一途径。B树的每个叶节点具有相同的高度,所以B树高度的增加发生在顶部而不是底部。插入节点的时候,从根的方向往下判断,如果不是叶子节点,则必须选择适当的叶子节点插入,因为在沿途已经分裂了节点,所以保证不会在满节点上再插入节点。5.B树的删除
和插入关键字类似,插入关键字的时候要保证节点不会太大,而且有可能会增高B树。删除节点的时候要保证一个节点不会变得太小,因为B树的节点上的关键字有下界要求(除了根节点以外的每个内部节点至少有t个孩子,如果树非空,根节点上至少有一个关键字),删除关键字的时候如果在叶子节点,而且删除之后还满足B树的要求,那直接删除即可,不过如果是其他情况,比如在内部节点上删除关键字,那就有一系列的算法分支需要考虑,感兴趣的读者可以自行找资料慢慢琢磨了。不过在实际场景中,由于一棵B树中大部分关键字都在叶节点中,删除操作最经常是从叶子节点中删除关键字。6.B树的应用场景
mysql的MyISAM和InnoDB两个存储引擎的索引实现方式:MyISAM引擎使用B+ Tree作为索引结构,叶节点存放的是数据记录的地址。
MyISAM引擎的辅助索引(二级索引)和主索引在结构上没有区别,只是辅助索引的key可以重复,叶节点上存放的也是数据记录的地址。
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
InnoDB中表数据本身就是按B+ Tree组织的一个索引结构,叶节点存放的就不是数据记录的地址,而是完整的数据记录。所以InnoDB这种存储方式,又称为聚集索引,使得按主键的搜索十分高效,但二级索引搜索需要检索两遍索引:首先二级索引获得主键,然后用主键到主索引中检索到数据记录。
因为主键是InnoDB表记录的”逻辑地址“,所以InnoDB要求表必须有主键,MyISAM可以没有。
相关文章推荐
- B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
- B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
- 数据库学习--B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
- 数据结构之顺序表增、删、查找、初始化以及顺序表输出基本相关操作
- asp.net数据库生成LigerUi树Tree结构Json格式数据(有点绕,附基本源代码)
- 队列的基本操作应用---舞伴问题(数据结构实验项目三)
- 数据结构实验项目三:队列的基本操作应用
- Relaxlife.net数据库操作的应用,数据库操作/表操作/表结构操作/索引(Index),主键操作/字段值操作(原版)
- JDBC实现数据库的几种基本操作(查询,分页查询,根据关键字进行查询以及插入数据)
- 爹地的实验:实验一: 数据结构实验一线性表的基本操作实现及其应用
- 数据存储(大数据):Hbase概述、特点、应用场景、基本操作
- 数据结构(C语言实现) - 二叉树的基本操作(建立,遍历,结点数,叶子结点数,高度,按树状打印,输出叶子结点等)
- Thinkphp 连接数据库操作以及如何创建数据
- MySql入门之一:DDL操作创建表(添加主键, 外键约束以及基本的数据类型)
- MySQL之终端(Terminal)管理数据库、数据表、数据的基本操作(转)
- 【数据结构】顺序表的基本操作
- 03-数据库和数据表的基本操作
- mysql数据的安装以及数据库的操作
- 从数据库sqlite3读取数据以及等等操作~~~~~应有尽有
- 【学习总结】数据结构之循环链表的基本操作