您的位置:首页 > 理论基础 > 数据结构算法

数据库索引-数据结构

2016-05-26 07:44 429 查看
在上一篇文章中我们说了数据库索引的本质和使用二叉树实现的数据库索引,然而在实际的数据库系统中,基本没有使用二叉树实现索引,大多使用改进后的B+树作为索引。

我们就来说一说其中的原因。

    改进后的B+树基于B+树,B+树又基于B树,所以我们先从B树谈起

    我们还是以Person(id,name,age)这个实例来讲诉B树。

B树是这样的一个数据结构:
d为大于1的一个正整数,称为B-Tree的度。


h为一个正整数,称为B-Tree的高度。


每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。


每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null 。


所有叶节点具有相同的深度,等于树高h。


key和指针互相间隔,节点两端是指针。


一个节点中的key从左到右非递减排列。


所有节点组成树结构。


每个指针要么为null,要么指向另外一个节点。


如果某个指针在节点node最左边且不为null,则其指向节点的所有key小于v(key1),其中v(key1)为node的第一个key的值。


如果某个指针在节点node最右边且不为null,则其指向节点的所有key大于v(keym),其中v(keym)为node的最后一个key的值。


如果某个指针在节点node的左右相邻key分别是keyi和keyi+1且不为null,则其指向节点的所有key小于v(keyi+1)且大于v(keyi)。


    如图所示:    


    这是一个度为2,key为id的B树,B树中的每个节点存放了一系列person。

    根据id查找一个person的算法复杂度为O(log[2]N)

    可见,度越大的B树存储效率越高,在度为D的B树种查找的时间复杂度为O(log[D]N)远小于二叉查找树

B树有许多变种,最常见的就是B+树,相比于前者,具有如下特点:

每个节点的指针上限为2d而不是2d+1。


内节点不存储data,只存储key;叶子节点不存储指针。


如下图所示:

    


    相比于B树,B+树的非叶节点仅仅存储了key和对应的指针,所有的person都存放在叶子节点中。

   至于为什么使用B+树而非B树,因为B+树更适合放在外部存储(非内存)中实现,具体原因我们后面会讲到

更高级的B+树:

    


        在普通B+树的基础上,对叶子节点进行指针相连。

        原本查询id为31和57的两个person,需要从根节点遍历到31所在节点一次,从根节点遍历到57所在节点一次。在带有顺序访问指针的节点B+树种,找到31所在的节点后,只要顺着节点和指针遍历下去便可访问到所需要的数据了,极大提高了区间查找效率
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: