B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
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)的由来、数据结构、基本操作以及数据库索引的应用的更多相关文章
- 线段树 Interval Tree
一.线段树 线段树既是线段也是树,并且是一棵二叉树,每个结点是一条线段,每条线段的左右儿子线段分别是该线段的左半和右半区间,递归定义之后就是一棵线段树. 例题:给定N条线段,{[2, 5], [4, ...
- 数据结构之树(Tree)(一) :树
ps:好久没用动手写blog了,要在这条路上不断发展,就需要不停的学习,不停的思考与总结,当把写blog作为一种习惯,就是自我成长的证明,Fighting!. 一.简介 树是一种重要的非线性数据结构, ...
- Linux 内核中的数据结构:基数树(radix tree)
转自:https://www.cnblogs.com/wuchanming/p/3824990.html 基数(radix)树 Linux基数树(radix tree)是将指针与long整数键值相 ...
- Python入门篇-数据结构树(tree)的遍历
Python入门篇-数据结构树(tree)的遍历 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.遍历 迭代所有元素一遍. 二.树的遍历 对树中所有元素不重复地访问一遍,也称作扫 ...
- Python入门篇-数据结构树(tree)篇
Python入门篇-数据结构树(tree)篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.树概述 1>.树的概念 非线性结构,每个元素可以有多个前躯和后继 树是n(n& ...
- 数据结构 B-树和B+树的应用:数据搜索和数据库索引
B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点 ...
- K:伸展树(splay tree)
伸展树(Splay Tree),也叫分裂树,是一种二叉排序树,它能在O(lgN)内完成插入.查找和删除操作.在伸展树上的一般操作都基于伸展操作:假设想要对一个二叉查找树执行一系列的查找操作,为了使 ...
- 基数树(radix tree)
原文 基数(radix)树 Linux基数树(radix tree)是将指针与long整数键值相关联的机制,它存储有效率,并且可快速查询,用于指针与整数值的映射(如:IDR机制).内存管理等.ID ...
- 『线段树 Segment Tree』
更新了基础部分 更新了\(lazytag\)标记的讲解 线段树 Segment Tree 今天来讲一下经典的线段树. 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间 ...
随机推荐
- Android LitePal 神一般的数据库框架 超级好用
参考: Android数据库高手秘籍(一)--SQLite命令 Android数据库高手秘籍(二)--创建表和LitePal的基本用法 Android数据库高手秘籍(三)--使用LitePal升级表 ...
- redis-删除所有key
删除所有Key,可以使用Redis的flushdb和flushall命令 //删除当前数据库中的所有Key flushdb //删除所有数据库中的key flushall 如果要访问 Redis 中特 ...
- 更新/替换系统 hosts,轻松访问国外站点
更新 hosts 下面介绍的操作均可能覆盖现有 hosts ,进行操作前请先确认是否需要备份. 推荐使用本项目的 Host Tools 来自动化 备份/配置 工作. 若更新 hosts 未立即生效,请 ...
- Java语法
java语法: 一个java程序可以说是一系列对象的集合,而这些对象都要通过调用彼此的方法来协同工作. 对象: 对象是一个实例,例如:一只猫,它是一个对象,有状态和行为.它的状态状态有:颜色,名字,品 ...
- Spring单例模式与线程安全
问题背景 这段时间在做项目的时候,考虑到Spring中的bean默认是单例模式的,那么当多个线程调用同一个bean的时候就会存在线程安全问题.如果是Spring中bean的创建模式为非单例的,也就不存 ...
- [UOJ30/Codeforces Round #278 E]Tourists
传送门 好毒瘤的一道题QAQ,搞了好几好几天. UOJ上卡在了53个点,CF上过了,懒得优化常数了 刚看时一眼Tarjan搞个强连通分量然后缩点树链剖分xjb搞搞就行了,然后写完了,然后WA了QAQ. ...
- 友盟ionic多渠道自动签名app
这几天公司的运营部门要求添加流量统计功能,集成了友盟的插件,中间遇到很多的问题,在这里说明记录一下,为遇到相同问题的朋友们减少麻烦 问题一.插件的使用直接将友盟sdk系在放置到项目根目录下plugin ...
- 树莓派2系统DietPi简单安装配置使用介绍
DietPi在Raspberrypi.org上的原帖:http://dwz.cn/HSrmY 版本发布很频繁,给原作者们点个赞.功能会越来越多,而且作者的定制观点很明确,适合树莓派的使用. 之前关于D ...
- CocoaPods 升级
也不知道是什么时候,ruby.taobao开始不能用了,在公司的电脑上一直装不上,还卡在那里, 旁边的老大投来了异样的目光,或者我是应该提升下技术了-- 一.升级gem gem update --sy ...
- Bash 的 no-fork 优化
我们知道,Bash 在执行一个外部命令时,会先 fork() 一个子进程,然后在子进程里面执行 execve() 去加载那个外部程序.fork 子进程是会耗性能的,所以 Bash 会在下面几种情况下不 ...