数据库索引

来源:互联网 发布:同比环比数据分析 编辑:程序博客网 时间:2024/06/08 13:50

一、索引之初


索引是帮助数据库高效获取数据的数据结构。数据查找有很多种方式,有顺序查找,时间复杂度为O(n),在大规模数据查询中,显然这种时间复杂度是不可接受的,时间复杂度更为优秀的算法有很多,有二分查找、树的搜索,但是这些算法在应用时,对数据都是有一定要求的,满足特定的数据结构才能使用。DBMS若想使用这些算法,就必须维持特定的数据结构。这种数据结构我们就称之为索引。

在我们很多的例子中,都是空间和时间的平衡,在数据库中,为了换取时间上的更优,使用索引的缺点之一就是占用部分空间。当然它还有其他缺点,如需要维护这个数据结构,在插入、删除等操作时,带来一些其他操作。一般数据库最常见的操作时查看,所以,牺牲部分空间换取时间的更优是可取的。


二、索引的数据结构

索引通常使用B-树、B+树的数据结构实现。文件系统也是采用B-树、B+树的数据结构,数据库系统和操作系统。
B树查找,首先从根节点开始查找,在每个节点

2.1 B-树

B-树就是B树,类似于我们常见的二叉搜索树,不过之里是多路搜索树。
一个m阶B树。
①B-树允许M-1个子节点。
②根节点至少有两个子节点
③每个非根节点的关键字个数满足┌m/2┐ - 1 <= j <= m - 1
④每个节点关键字以升序排序
节点中关键字之间的值在其子节点中 (类似于二叉排序树中左子树<父节点<右子树)
⑥叶节点位于同一层,非叶节点关键字也保存数据


B树查找,类似于二叉排序树,不同之处,在于树不是二叉,在每个节点上进行的是二叉搜索。

假如查找28,在根节点开始二叉搜索,发现根节点没有,在这两之间找到指针指向的子节点上继续二叉搜索,直至页节点或者找到数据。


2.2 B+树

它是B树的一种变形。
k个子节点有k个关键字。和b-树不同,b-树k个子节点可以有k+1个关键码。
②非叶节点不存数据,仅做索引,记录位置信息。
叶节点存放数据

B+树的搜索和B-树类似,只不过搜索要持续一直到叶节点。
在图中,叶节点所带的链表指针,是为了适应数据库操作所更改的。
计算机中一个理论,访问了一个数据,它之后的数据也有很大可能性被访问,所以可以一次读入要查找的数据和它之后的数据,可以降低IO。

三、索引的分类


索引分为聚集索引和非聚集索引。

3.1 聚集索引

聚集索引也叫聚簇索引、聚类索引、簇集索引。
聚集索引表中行的物理顺序和逻辑顺序一样
一个表只能有一个聚集索引(一个表只能有一个排序规则)
一般把无聚集索引的称之为堆集
叶节点是是数据节点

3.2 非聚集索引

数据表物理顺序不按照逻辑顺序排列,而是按照插入顺序排列。
索引的叶节点就是存数据位置的信息,像c语言的指针,不存贮数据。这种类似于目录结构,有目录文件(索引
文件),有数据文件。从目录中找数据,加快查找速度。非聚集索引叶子节点指向堆或者聚集索引的指针。

3.3 比较:

聚集索引和非聚集索引可以类比于数组和链表。聚集索引像数组,需要维持物理顺序,为保持这种顺序,需要耗费更多的资源,但是,查找效率也更高。这里的说非聚集索引像链表,不是说它只能从头节点开始访问,而是说它,存贮的位置不是有序的,索引的位置是通过指针来查找,更恰当的比方是比作一个目录。数据库系统表的存储和操作系统十分相似,操作系统有段页式存贮,通过给分段,页号,页内偏移来找到数据。
有一种很恰当的比喻,聚集索引就像字典按照字母排序非聚集索引像字典按照部首排序,在部首排序中,有一个维持部首的目录,指向部首对应字的位置。

四、数据库访问数据


4.1 访问没有索引的数据库表

数据库表在无序的时候,存放在堆中,数据库在一堆无序的数据中查找某个数据,势必要遍历这个表,一个书架中找一本书,没有索引,没有排序,也许不难,如果一个图书馆的书是无序的,想要在这样一个图书馆里找一本书,工作量得有多大。

4.2 访问有非聚集索引的数据表

使用b-树的结构,叶节点不包含数据页,只包含索引行,每个索引行包含索引键值以及行定位符(ROWID,RID)在树中叶节点找到RID,RID通常包括页号,页内偏移,类比操作系统段页式存贮。
还是字典的例子,我们把数据分类,假如按照部首,建立一个部首的目录(索引),根据这个目录,我们能找到字的页码,从而可以在该页码找到该字的具体信息。

4.2 访问有聚集索引的数据表

聚集索引,叶节点存放数据,使用b+数结构,到页节点才有数据,而且数据是有序的,直接查找即可。

4.3 访问有聚集索引和非聚集索引的数据表

在同时存在聚集索引和非聚集索引的时候,数据的物理顺序还是按照聚集索引的逻辑顺序排列,在检索数据的时候,按照B+树的搜索方式搜索,在页节点,存贮的是索引它会指向聚集索引,即若表上已经存在聚集索引,则引用聚集索引的页。


转载请注明出处 http://blog.csdn.net/madujin/article/details/70208849

***************************************************************************************************************************************************************************************
最后上一张别人总结的图片:
转载:http://www.cnblogs.com/gavinsp/p/5513536.html




0 0
原创粉丝点击