文件组织和索引

来源:互联网 发布:vscode terminal 编辑:程序博客网 时间:2024/06/05 14:59


        数据库文件组织方法

        数据组织要考虑更新(增、删、改)和检索需求
                更新将涉及数据存储空间的扩展与回收问题
                检索将涉及扫描整个数据库的问题、大批量处理数据问题
                不同的需求要求不同的数据组织方法和存取方法

       文件组织: 指数据组织成记录,块和访问结构的方式,包括把记录和块存储在磁盘上的方式,以及记录和块之间互相联系的方式。

      存取方法:对文件所采取的存储操作方法,一种文件组织可以采用多种存取方法进行访问

     

      文件组织:

              1 无序文件组织

                特点:记录可存储于任意有空间的位置,磁盘上存储的记录是无序的,更新效率高,检索效率低

                         存取方法:1  新纪录插入文件尾部,可以直接删除记录所在的位置内容,还可以在记录前标记删除标记

                                              2 在前者基础上,新增记录可以利用那些标记为“删除标记”的空间

               频繁删增会造成空间浪费,周期性重新组织数据库

               数据库重组:通过移走被删除的记录使有效记录连续存放,从而回收那些由删除记录而产生未利用空间

  

               2 有序记录文件

               特定:记录按某属性或属性组值的顺序插入,磁盘上存储的记录是有序的。检索效率可能高。
               用于存储排序的属性通常称为排序字段(Orderingfield),通常,排序字段使用关系中的主码, 所以又称排序码(Orderingkey)

               当按排序字段进行检索时,速度得到很大提高;但当按非排序字段检索时,速度可能不会提高很多

               有序记录文件的更新效率可能很低 因为:在更新时要移动其他记录,为插入记录留出空间

                改进措施是可为将来有可能插入的元组预留空间(这可能造成空间浪费),或者再使用一个临时的无序文件(被称为溢出文件)保留新增的记录。

               当采取溢出文件措施时,检索操作既要操作主文件,又要操作溢出文件。所以需要周期性重新组织数据库

               数据库重组 是将溢出文件合并到主文件中,并恢复主文件中的记录顺序

 

              3 散列文件组织

                 特点:可以把记录按某属性或属性组的值,依据一个散列函数来计算其应存放的位置:桶号(Bucket,块号或簇号等)。检索效率和更新效率都有一定程度的提高

                用于进行散列函数计算的属性通常称为散列字段(Hashfield),散列字段通常也采用关系中的主码,所以又称散列码(hashkey)

                 不同记录可能被hash成同一桶号,此时需在桶内顺序检索出某一记录

          

                4 聚簇文件

                    聚簇:将具有相同或相似属性值的记录存放于连续的磁盘簇块中

                    多表聚簇:将若干个相互关联的Table存储于一个文件中—这可提高多表情况下的查询速度

                   

      索引

     

             1  为什么需要索引,什么是索引

                索引 是定义在存储表(Table)基础之上,有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构,由一系列存储在磁盘上的索引项(indexentries)组成,每一索引项又由两部分构成:

                          索引字段:由Table中某些列(通常是一列)中的值串接而成。索引中通常存储了索引字段的每一个值 (也有不是这样的)。索引字段类似于词典中的词条。

                           行指针:指向Table中包含索引字段值的记录在磁盘上的存储位置 。行指针类似于词条在书籍、词典中出现的页码 。

                存储索引项的文件为 索引文件 ,相对应,存储表又称为 主文件

               

                 索引文件是一种辅助存储结构,其存在与否不改变存储表的物理存储结构;然而其存在,可以明显提高存储表的访问速度。

                索引文件组织方式有两种: (相对照的,主文件组织有堆文件、排序文件、散列文件、聚簇文件等多种方式)

                           排序索引文件(Orderedindices):按索引字段值的某一种顺序组织存储

                         散列索引文件(Hashindices):依据索引字段值使用散列函数分配散列桶的方式存储

               索引的一般特性

                           在一个表上可以针对不同的属性或属性组合建立不同的索引文件,可建立多个索引文件。索引字段的值可以是Table中的任何一个属性的值或任何多个属性值的组合值

                           索引文件比主文件小很多。通过检索一个小的索引文件(可全部装载进内存),快速定位后,再有针对性的读取非常大的主文件中的有关记录

                           有索引时,更新操作必须同步更新索引文件和主文件

               关于索引应用的评价      索引技术应用使检索效率大幅度提高,但同时其也增加了存储空间、使维护负担加重(不仅要维护主文件,而且要维护索引文件)

                          1 访问时间     2  插入时间    3 删除时间   4 空间负载   5   支持存取的有效性,比如:支持的是属性的限定值(是否符合单一值),还是支持属性的限定范围的值(是否符合一定范围)

               对哪些属性建立索引   经常出现在索引条件,连接条件,分组计算条件的属性建立索引           SELECT…FROM…WHERE…GROUP BY… 

                 码(Key)、主码(Primary Key), 又称为表键(Table Key)---具有唯一性和最小性             排序码(OrderKey)---对主文件进行排序存储的那些属性或属性组

                 排序码(OrderKey)---对主文件进行排序存储的那些属性或属性组             搜索码(SearchKey)---在主文件中查找记录的属性或属性集

               SQL语言关于索引的基本知识
                         当定义Table后,如果定义了主键,则系统将自动创建主索引,利用主索引对Table进行快速定位、检索与更新操作;
                         索引可以由用户创建,也可以由用户撤消
                         当索引被创建后,无论是主索引,还是用户创建的索引,DBMS都将自动维护所有的索引,使其与Table保持一致,即:当一条记录被插入到Table中后,所有索引也自动的被更新
                          当Table被删除后(droptable),定义在该Table上的所有索引将自动被撤消

                 创建索引     create index  索引名  on 表名   (列名)  create index idxSnamcl on student(sname, sclass);

                 撤销索引   DROP INDEX indexname;

                

             2 索引分类

              稠密索引   vs   稀疏索引

                           对于主文件中每一个记录(形成的每一个索引字段值),都有一个索引项和它对应,指明该记录所在位置。这样的索引称稠密索引

                            对于主文件中部分记录(形成的索引字段值),有索引项和它对应,这样的索引称非稠密索引(undense index)或稀疏索引

                   稀疏索引如何定位

                   定位索引字段值为 K的记录,需要
                   首先找相邻的小于K的最大索引字段值所对应的索引项
                  从该索引项所对应的记录开始顺序进行Table的检索
                  稀疏索引的使用要求—主文件必须是按对应索引字段属性排序存储
                  相比稠密索引:空间占用更少,维护任务更轻,但速度更慢
                   平衡:索引项不指向记录指针,而是指向记录所在存储块的指针,即每一存储块有一个索引项,而不是每条记录有一索引项----主索引

                

          主索引   vs  辅助索引

                  主索引 通常是对每一存储块有一个索引项,索引项的总数和存储表所占的存储块数目相同,存储表的每一存储块的第一条记录,又称为锚记录

                  主索引的索引字段值为块锚的索引字段值,而指针指向其所在的存储块

                  主索引是按索引字段值进行排序的一个有序文件,通常建立在有序主文件的基于主码的排序字段上,即主索引的索引字段与主文件的排序码(主码)有对应关系

                  主索引是稀疏索引

                 

                 辅助索引 是定义在主文件的任一或多个非排序字段上的辅助存储结构。

                辅助索引通常是对某一非排序字段上的每一个不同值有一个索引项:索引字段即是该字段的不同值,而指针则指向包含该记录的块或该记录本身;
               当非排序字段为索引字段时,如该字段值不唯一,则要采用一个类似链表的结构来保存包含该字段值的所有记录的位置。
             

             辅助索引是稠密索引,其检索效率有时相当高。

             一个主文件仅可以有一个主索引,但可以有多个辅助索引
            主索引通常建立于主码/排序码上面;辅助索引建立于其他属性上面
            可以利用主索引重新组织主文件数据,但辅助索引不能改变主文件数据
           主索引是稀疏索引,辅助索引是稠密索引

            聚簇索引  vs 非聚簇索引

            聚簇索引 —是指索引中邻近的记录在主文件中也是临近存储的;
            非聚簇索引 —是指索引中邻近的记录在主文件中不一定是邻近存储的。


            此外还有多级索引(B+树索引), 散列索引等

    


                   

原创粉丝点击