BTree 的讲解
B树叫多路平衡查找树,一棵M阶的B树的特性:
- 树中每个节点最多含有m个孩子(M>=2);
- 除根节点叶子节点外,其他节点具有ceil(M/2)个孩子
- 所有的叶子节点都是在同一层的,每个非终端节点都包含n个关键字(n1, n2,n3….)关键字n的取值范围{ceil(M/2)-1, m-1}
- 每个节点的关键字都是有序的
B树的查找
B树的插入操作
在进行插入的时候,先是根据要插入的数据,在B树中找到合适的位置,如果在该位置上面插入这个关键字的时候,如果这个关键字的个数超过了范围,则就需要进行分裂操作,分裂的时候,是把该节点上中间位置的关键字往父节点的位置上提。
B树的删除操作
删除操作,节点中的关键字的个数小于ceil(M/2)-1的话,则看相邻的兄弟节点是否丰满(就是兄弟节点的数据个数大于ceil(M/2)-1, 小于m-1)如果丰满的话,就想这个兄弟节点接一个元素,要是刚饱和的话,在借完的时候,那么兄弟节点需要去寻找借贷的对象;要是找不到的话,就需要合并,从父节点下移一个元素,合并操作。
B树的应用场景:
Mysql的MyisAM和iNNoDB两个存储引擎都是Btree实现的:
- MyISAM引擎使用B+ Tree作为索引结构,叶节点存放的是数据记录的地址。
- MyISAM引擎的辅助索引(二级索引)和主索引在结构上没有区别,只是辅助索引的key可以重复,叶节点上存放的也是数据记录的地址。
- MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
- InnoDB中表数据本身就是按B+ Tree组织的一个索引结构,叶节点存放的就不是数据记录的地址,而是完整的数据记录。所以InnoDB这种存储方式,又称为聚集索引,使得按主键的搜索十分高效,但二级索引搜索需要检索两遍索引:首先二级索引获得主键,然后用主键到主索引中检索到数据记录。
- 因为主键是InnoDB表记录的”逻辑地址“,所以InnoDB要求表必须有主键,MyISAM可以没有
对于Hbase的存储数据结构是LSM树(lOg structure merge tree)支持增 删 读 改 顺序扫描 。但是LSM树和Btree相比牺牲了部分读的性能,提高了写的性能。
LSM树的设计非常的朴素:将对于数据的修改在内存中进行的,当内存满了之后,会溢出批量到磁盘上的,但是读取的效率就比较麻烦,主要看是否能不能命中内存,否则需要合并磁盘的历史数据和内存中最近修改的数据来进行操作,这样读取的性能比mysql低,但是写的性能比mysql高。
更加详细的说明可以看这个博客内容:https://blog.youkuaiyun.com/endlu/article/details/51720299