B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
2014-11-27 21:29
726 查看
B树是为磁盘存储而专门设计的一类平衡搜索树,B树的高度仅随着它所包含的节点数按对数增长,不过因为单个节点可以包含多个关键字,所以对数的底数可以比较大,实际应用中一般是50~2000,给个直观的数字,一棵分支因子为1001、高度为2(不包含根节点)的B树,可以存储超过10亿个关键字!
MyISAM引擎使用B+ Tree作为索引结构,叶节点存放的是数据记录的地址。
MyISAM引擎的辅助索引(二级索引)和主索引在结构上没有区别,只是辅助索引的key可以重复,叶节点上存放的也是数据记录的地址。
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
InnoDB中表数据本身就是按B+ Tree组织的一个索引结构,叶节点存放的就不是数据记录的地址,而是完整的数据记录。所以InnoDB这种存储方式,又称为聚集索引,使得按主键的搜索十分高效,但二级索引搜索需要检索两遍索引:首先二级索引获得主键,然后用主键到主索引中检索到数据记录。
因为主键是InnoDB表记录的”逻辑地址“,所以InnoDB要求表必须有主键,MyISAM可以没有。
http://www.cnblogs.com/yanghuahui/p/3483047.html
-- 杨华辉 Switching and Intelligent Control Research Center Beijing University of Posts and Telecommunications E-mail: huahuiyang(at)gmail.com
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可以没有。
http://www.cnblogs.com/yanghuahui/p/3483047.html
-- 杨华辉 Switching and Intelligent Control Research Center Beijing University of Posts and Telecommunications E-mail: huahuiyang(at)gmail.com
相关文章推荐
- 数据库学习--B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
- B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
- B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
- Relaxlife.net数据库操作的应用,数据库操作/表操作/表结构操作/索引(Index),主键操作/字段值操作(原版)
- 爹地的实验:实验一: 数据结构实验一线性表的基本操作实现及其应用
- 队列的基本操作应用---舞伴问题(数据结构实验项目三)
- JDBC实现数据库的几种基本操作(查询,分页查询,根据关键字进行查询以及插入数据)
- 数据结构之顺序表增、删、查找、初始化以及顺序表输出基本相关操作
- asp.net数据库生成LigerUi树Tree结构Json格式数据(有点绕,附基本源代码)
- 数据结构实验项目三:队列的基本操作应用
- 黑马程序员--数据库概述,表,主外键,以及常用基本数据类型
- 4.如何优化操作大数据量数据库(几十万以上数据)(如何选择聚合索引)
- EasyUI_tree根据数据库数据非迭代生成树形结构
- 数据结构与算法面试题汇编(1)- 链表的操作与应用
- C++ 模板类 栈基本操作 数据结构
- 4.如何优化操作大数据量数据库(几十万以上数据)(如何选择聚合索引)
- 数据结构中线性表的一些基本操作
- 数据结构——链栈的基本操作
- Java中的移位操作以及基本数据类型转换成字节数组【收集】
- ADO.NET访问数据-DataSet本地缓存与数据库的交互过程,以及应用