你看,像这个B树,B+树,数据库索引,这些基础,你在大学里都学过吧。。。。。。
放屁,大学里哪学过这些。------------你知道我是在讽刺我的大学吗?不过,我仍然对我的母校,爱的痴狂。
B+树
B+树是在B树的基础上,专为文件系统和数据库而出现的一种数据结构。
首先说一下B+树的定义。
对于一个m阶的B+树有如下定义:
1.根节点只有一个,根节点最多有m个子树,最少有2个子树。([2,m])
2.除根节点外,所有非叶子节点最多有m个子树,最少有m/2个子树。即:[ceil(m/2),m]
3.n个子树的非叶子节点有n个关键字(索引)。
4.所有的叶子节点都在同一层,所有的关键字都在叶子节点,且按照一定的顺序排列,关键字的数目最少是m/2,最多m。即[ceil(m/2),m].
5.B+树有两个头指针,一个指向根节点中最小的节点,另一个指向根节点。
如图 B+树:
图片是copy的别人的。http://blog.csdn.net/aqzwss/article/details/53074186。我自己作图实在是特别丑。
根据B+树的定义,可以知道B+树有如下特性:
所有的关键字都出现在叶子节点的链表中,且链表中的关键字恰好是有序的。
在查找的时候,不可能在非叶子节点中命中,因为非叶子节点中存储的都是索引。
如果想知道mysql为什么会选择b+树做索引,火箭直达:http://blog.codinglabs.org/articles/theory-of-mysql-index.html。
B+树的插入操作:(图片均为copy,大人有大量)
有如下B+树:第一种情况:插入新的值,没有破坏B+树:
如插入9:
检查是否破坏了B+树的性质。没有,那么直接插入。
第二种情况:
如插入20
发现【20,21,37,44】这个节点破坏了B+树的性质。那么就把这个节点拆分成【20,21】,【37,44】连个节点,并且把21抽取到父节点中。如图:
这时【15,21,44,59】仍然破坏了B+树的性质,将该节点拆分成【15,21】,【44,59】两个节点,并且将21抽取到父节点中。
如图:
第三种情况:
插入100:
这个时候,发现所有的父节点都比100要小,所以修改其父节点的值为100.
并且【85,91,97,100】这个节点,不符合B+树的性质,将91向上抽取,
不用作图,真的是很快啊。这个图,和第一章图有所差别,非叶子节点中记录的索引是数据的最小值。而实例中的图中索引是记录的最大值。原理一致。每次看到这,请记住,自己一定要在纸上画画图。
删除操作
第一种情况:删除数据后,对原B+树,没有影响。
如:删除91
第二种情况:删除97
修改其父节点的值为数据中的最大值(栗子中的是91)。看是否符合B+树的性质。
第三种情况:删除51.
这时,破坏了B+树的性质(叶子节点中的关键字数目[ceil(m/2),m])。将44合并到【59】节点中,并且将37抽取到父节点【15,44,59】中,即如下图:
第四种情况:
删除59
第五种情况:删除63
如果以上说话有错,劳请指正,非常感谢。
2018-03-20 方小白 畅游大厦