数据库中文件的组织方式
数据库的组织要考率更新和检索的需求,更新涉及到数据的存储空间的扩展和回收的问题,检索涉及到扫描整个数据库,和大批量处理数据的问题,不同的需求要求不同的数据组织方式和存取方式。
数据的组织方法是指数据组成记录,块,和访问结构的方式,包括把记录和块存储在磁盘上的方式,以及块和记录之间的相互联系。
存取方法是指对文件所采取的存取操作方法。
一种文件组织可以采取多种存取方法进行访问
无序的文件组织方法(堆文件heap 或pile file)
特点:记录可以存储在任意的空间位置,磁盘上的存
储记录是无序的,更新效率高,但是检索效率低。
方法一:每一次插入数据都插入到数据的尾部,删除数据的时候我们将被删除的记录做一个标记,不做标记的话会涉及到大规模的数据移动,是不安全的。
方法2:在被标记的基础上,如果插入数据所占用的空间小于被标记的空间将新的记录插入到被标记的记录处。
但是频繁的更新数据会造成空间的浪费,导致数据库性能下降,所以需要周期性重新组织数据库。即数据库重组。
有序的文件组织(Sequential file)
特点:记录按照某个属性或者属性组值得顺序插入,磁盘上的存储记录是有序的,检索的效率可能高。
用于存储排序的字段通常称为排序字段,排序字段一般使用关系之中的主键,又称为排序码。当按排序字段检索的时候检索的速度会得到提高,但是当按照非排序字段检索的时候检索的速度不会提高很多。但是有序的文件组织的更新效率比较低,因为在插入数据的时候要大规模的移动数据为插入数据留出空间而且是不安全的。
改进:使用一个临时无序文件(溢出文件)保留新增记录。当采取溢出文件的时候检索既要操作主文件又要操作溢出文件,所以需要周期性的重组数据库。
散列文件组织(hash file)
特点:将记录某个属性或者属性组值,依据散列函数计算出其应该存放的位置:桶号。检索的效率和跟新的效率都有一定的提升。
用于进行散列函数的属性或者属性组的值称为散列字段,通常采用
关系中的主码,也叫散列码。
聚簇文件组织(Clustering file)
聚簇:将具有相同或相似属性值的记录存放于连续的磁盘簇块中。
多表聚簇:将若干相关联的表存储在同一个文件中,这样可以提高多表查寻的速度。
索引
索引是定义在表基础之上,有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构,由一系列存储在磁盘上的索引项组成,每一个索引项又由两部风构成:
索引字段:由table中的某些列中的值串接而成,索引通常存储了索引字段的每一个值。类似于字典中的词条。
行指针:指向table中包含索引字段值的记录在磁盘上的存储位置,类似于页码。
存储索引项的文件称为索引文件,存储表称为主文件。
优点:
索引是一种辅助存储结构,不改变存储表的物理存储结构,但是可以明显提高存储表的访问速度。索引文件有两种组织方式:
排序索引文件:按索引字段值的某一种顺序组织存储。
散列索引文件:依据索引字段值使用散列函数分配散列桶的方式存储
特点:
在一个表上可以针对不同的属性或属性组建立不同的索引文件,索引字段的值可以是table中的任何一个属性的值或任何多个属性的值。
索引文件要比主文件小很多。索引文件可以直接装载入内存中,通过检索索引文件,快速定位后,再有针对的读取较大的主文件中的相关记录。但是索引技术虽然使检索的效率大大提高,但是同时增加了存储空间,维护负担(不仅要维护主文件,还要维护索引文件)
衡量索引性能的好坏:
访问时间
插入时间
删除时间
空间负载
支持存取的有效性
排序码:对主文件进行排序存储的那些属性或者属性组
索引码:即索引字段,不一定具有唯一性
搜索码:在主文件查找记录的属性或属性集
在DBMS中,当定义了表之后,如果定义了主键,系统会自动创建主索引,利用主索引可以对table进行快速的定位,检索和跟新。
当然用户也可以自己创建索引和撤销。DBMS会自动维护所有的索引。当表被删除之后,定义在表上的索引也会被自动撤销
创建索引:
create [unique] index indexname on tablename(colname[asc|desc]......)
撤销索引:
drop index indexname;
稠密索引和稀疏索引
稠密索引:对于主文件中的每一个记录(形成的每一个索引字段值),都有一个索引项和它对应,之名该记录所在的位置,
这样的索引称为稠密索引
稀疏索引:对于主文件的部分记录(形成的索引字段值),有索引项和他对应,这样的索引称为稀疏索引。
- 稀疏索引是如何定位记录的:
定位搜索码值为K的记录,找到相邻的小于K值的最大索引字段值对应的索引项,按照记录的开始顺序检索。但是要求主文件的对应
索引字段必须按照字段的属性排序存储。
相对于稠密索引来说,稀疏索引空间占用更少,维护任务更轻,但是速度较慢。
假如要查询Downtown,那么稀疏索引会先在索引文件中找到Brigthon,再到对应的主文件中按照顺序查找记录。 - 稠密索引如何查找记录:
按候选键属性的稠密索引:主文件的候选键是唯一的和索引文件的索引码是一 一对应的。
非候选键属性的稠密查找分为三种情况:
1.索引文件中的索引码是不重复的,要求主文件必须按索引字段排序。
2.索引文件中的索引码是重复的,直接按对应的关系查询记录,不需要排序。
3.索引文件中的索引码是不重复的,引入指针桶处理,不需要排序。
主索引和辅助索引
主索引的索引字段值为块锚的索引字段值,指针指向其所在的存储块,一般使用主码且基于主码的排序字段上。主索引的索引码和主文件的排序码(主码)存在对应关系。主索引是稀疏索引。
辅助索引是定义在主文件的任意一个或多个非排序字段上的辅助存储结构。属于稠密索引。
区别:
1.一个主文件只能有一个主索引,但是可以有多个辅助索引
2.主索引通常建立在主码上;辅助索引建立在其他索引上面
3.可以利用主索引重新组织主文件数据,但是辅助索引不能改变主文件数据
B+树和B树索引
B+树索引:当索引项比较多的时候,不能一次装入内存,可以对索引再建立索引,形成多级索引。
B+树索引是一种以树形结构来组织索引项的多级索引。
B+树的实现方式:B+树包括了根节点,非页节点,叶节点。 跟节点和非叶节点的指针指向的是索引项的数据块,是对索引建立索引。叶子节点的指针指向主文件的数据块,但是它的最后一个指针指向的是下一个数据块,是对主文件的索引。
B树索引:B树是直接对主文件建立索引。
在oracle中B树的指针就是rowid。
不论是B+树还是B树节点的分裂(插入)和节点的合并(删除)算法。是关键。
示例:在oracle中常用的索引
- B树索引
B树一般适用于高基数的字段,即重复值少的字段。
未建立索引:
-- 在sql plus中打开跟踪器
SQL> conn sys/change_on_install as sysdba;
已连接。
SQL> set autotrace on;
SQL> select * from c##scott.emp where sal>1500;
未对搜索码建立索引,进行了全表扫描。
建立B树索引后:
create index emp_sal_index on c##scott.emp(sal);
- 位图索引:
适用于基数小的字段
假如要查询部门编号为10的雇员,但是部门编号只有10,20,30三个基数。如果表中30w条记录那么这些列也只会分为3组,进行位图查找十分的方便和便捷。位图索引以一种压缩数据的格式存放,占用磁盘空间要比B树索引小很多。
create bitmap index emp_deptno_index on c##scott.emp(deptno);