日期:2014-05-16  浏览次数:20455 次

漫谈数据库索引 (转)

一、引言

对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助。有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步。[最近首页之争沸沸扬扬,也不知道这个放在这合适么,苦劳?功劳?……]

?

?

二、 B-Tree

我们常见的数据库系统,其索引使用的数据结构多是 B-Tree 或者 B+Tree 。例如, MsSql 使用的是 B+Tree Oracle Sysbase 使用的是 B-Tree 。所以在最开始,简单地介绍一下 B-Tree

?

B-Tree 不同于 Binary Tree (二叉树,最多有两个子树),一棵 M 阶的 B-Tree 满足以下条件:
1 )每个结点至多有 M 个孩子;
2 )除根结点和叶结点外,其它每个结点至少有 M/2 个孩子;
3 )根结点至少有两个孩子(除非该树仅包含一个结点);
4 )所有叶结点在同一层,叶结点不包含任何关键字信息;
5 )有 K 个关键字的非叶结点恰好包含 K+1 个孩子;

另外,对于一个结点,其内部的关键字是从小到大排序的。以下是 B-Tree M=4 )的样例:

? ?

对于每个结点,主要包含一个关键字数组 Key[] ,一个指针数组(指向儿子) Son[] 。在 B-Tree 内,查找的流程是:使用顺序查找(数组长度较短时)或折半查找方法查找 Key[] 数组,若找到关键字 K ,则返回该结点的地址及 K Key[] 中的位置;否则,可确定 K 在某个 Key[i] Key[i+1] 之间,则从 Son[i] 所指的子结点继续查找,直到在某结点中查找成功;或直至找到叶结点且叶结点中的查找仍不成功时,查找过程失败。

接着,我们使用以下图片演示如何生成 B-Tree M=4 ,依次插入 1~6 ):
从图可见,当我们插入关键字 4 时,由于原结点已经满了,故进行分裂,基本按一半的原则进行分裂,然后取出中间的关键字 2 ,升级(这里是成为根结点)。其它的依类推,就是这样一个大概的过程。