Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427405
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类:

2008-06-17 23:57:48

系统对索引的处理

根据用户对表中记录的处理,数据库系统相应地维护索引中的记录,从而使表和索引在数据上保持一致。

 

1. 查询记录

 

用户要查询表中记录,系统首先判断是否可以使用索引。在使用索引访问的情况下,首先从索引的根页开始,找到小于或者等于搜索码值的最大键值,根据键值对应的指针,走到下一级的索引页。在下一级索引页,仍旧沿用以上方法,从而一直到达索引的叶页。到达叶页之后,系统就可以确定能否找到该搜索码值。如果找到,就使用记录号定位到表中的记录。

例如:在图4-3中,要查找搜索码值Dull,系统按照以下的路径查找:页1001100711321296

 

2. 插入记录

 

用户向表中插入记录,将引起数据库系统对索引中记录的插入。往索引中插入记录时,系统首先使用和查询记录相同的方法,找到要插入键值应当放置的叶页。在找到要插入的叶页之后,根据叶页当前的空间使用情况,系统会采取不同的处理方法:

 

 

1)叶页有可以使用的空闲空间。系统保证叶页中键值的顺序,在适当位置插入该键值。

2)叶页没有可以使用的空闲空间。这种情况下,需要对叶页进行拆分。首先,系统为索引分配一个新的叶页(如果索引没有可用空间,就首先进行磁盘空间的分配),在索引的页链中加入这个新的叶页。然后,原有叶页中大约半数的记录被移动到新的叶页,新的键值也按照顺序被插入。

由于在索引中增加了一个新的叶页,因此需要在上一级的分支页中插入记录,以指向这个新的叶页。如果上一级分支页同样没有可用空间,就按照相同的方式进行页的拆分。在最坏的情况下,从叶页、分支页,一直到根页,都没有可用空间,需要在索引页的各个级别上进行页的拆分。

对根页的拆分,系统需要生成新的根页,在根页中使用两个指针指向原有根页被拆分后的两个索引页,这两个索引页就变成分支页。

例如:在图4-3中,要插入码值Flood,需要进行叶页的拆分,拆分后见图4-4

 

3. 删除记录

 

用户删除表中记录,将引起数据库系统对索引中记录的删除。删除索引中记录时,系统首先使用和查询记录相同的方法,找到要删除键值所在的叶页,然后从该叶页中进行键值的删除。在删除操作完成之后,根据叶页的空间使用情况,系统会采取不同的处理方法:

 

 

1)叶页中仍包含键值。这种情况下,系统不做任何处理。

2)叶页中没有包含任何键值。就是说,叶页没有包含任何记录。这种情况下,需要对叶页进行归并,将不再需要的叶页从索引的页链中删除,同时从上一级的分支页中删除指向该叶页的指针。如果上一级分支页同样没有包含任何记录,就按照相同的方式进行页的归并。

例如:在图4-3中,删除码值Karsen,需要进行叶页的归并,归并后见图4-5

 

4. 更改记录

 

用户更改表中记录,如果索引所使用的字段被更改,将引起数据库系统对索引中记录的更改。系统对索引中记录的更改,是首先将原有键值从索引中删除,然后再将新的键值插入索引,其处理过程可见以上索引中记录的删除和插入。

阅读(673) | 评论(0) | 转发(0) |
0

上一篇:4.4.4 索引的创建

下一篇:4.4.2 索引的结构

给主人留下些什么吧!~~