数据库索引
1.顺序索引
顺序索引的作用主要用于能迅速地按顺序或随机地访问文件中的记录顺序索引的结构是按顺序存储搜索码的值并将搜索码与包含该搜索码的记录关联起来。
如果被索引的字段本身按照一定的顺序排序,那么这种索引叫做聚集索引。否则叫做非聚集索引。
如果被索引的字段的每个值都有一个索引与其对应,那么这种索引叫做稠密索引,否则叫做稀疏索引。
顺序索引分为两类,单级索引(很少使用)和多级索引(通常是B+树,大量使用)。
单级索引就是把所有的索引字段以及对应的文件位置按顺序一个个的排列出来,这种索引查找起来比较慢,因为是顺序存储的,可以使用二分查找法,但是总体来说效率不高,这种索引是最基础的索引,一般不用,ORACLE里面好像不支持这种索引。
多级索引实际上就是在单级索引之上再加索引(稀疏索引),也就是指向索引的索引,二级索引上面还可以再加三级索引,可以不停的加,加到最后最上层只剩下一个节点(根节点),就成了一个树状结构了。
2.散列索引
散列索引是指将索引结构中的搜索码及相应指针组织成散列文件的形式。因此,散列索引的构造如下:将散列函数作用于搜索码以确定对应的存储桶,然后将此搜索码及相应的指针存入此存储桶(或溢出桶),而指针指向数据文件中的记录。
3.位图索引
位图的基本思想就是对每一个条件都用0或者1来表示,如有5条记录,性别分别是男,女,男,男,女,那么如果使用位图索引就会建立两个位图,对应男的10110和对应女的01001,这样做有什么好处呢,就是如果同时对多个这种类型的字段进行and或or查询时,可以使用按位与和按位或来直接得到结果了。
4.用索引还是散列
在实际的数据库系统设计中,到底是用索引还是散列要充分考虑以下几个问题:
⑴ 索引或散列的周期性重组代价如何?
⑵ 在文件中插入和删除记录的频率如何?
⑶ 为了优化平均访问时间而导致最坏情况下的访问时间的做法是否可取?
⑷ 能够有效支持的查询类型是哪些?
对查询类型的支持
⑴ 我们先看一个散列适合的查询:select A1, A2, … , An from r where Ai = c对于这个查询来说:
① 顺序索引查找所需要的时间与关系r中Ai值的个数的对数成正比;但在散列结构中,平均查找时间是一个与数据库大小无关的常数,因此这是一个适合用散列的查询;
② 使用索引时,最坏情况下的查找时间和关系r中Ai值的个数的对数成正比;而散列在最坏情况下可能需要搜索所有记录(散列函数将所有的搜索码值都映射到同一个存储桶中),但这种情况发生的可能性极小。
⑵ 我们再来看一个索引适合的查询:
select A1, A2, … , An from r where Ai >= c1 AND Ai <= c2对于这个查询来说:
① 使用索引时,首先查找值c1所在的块或桶,然后顺着索引中的指针链(顺序索引中的搜索码链表或B+树索引中的叶结点的Pn指针链)继续查找,直到查找到值c2为止;
② 如果使用散列,由于散列函数的随机性,将不得不读取所有的存储桶。因此这是一个适合用索引的查询。
参考(转):http://www.educity.cn/zk/161036.html
http://www.2cto.com/database/201109/102411.html?fw_key=35891B7975908312