-
存储结构
一.表空间
1.概念:一张数据表在数据库空间中以一个表空间的形式存储。表空间由数据段、索引段、回滚段组成,分别记录一张表的不同信息。
2.层次信息
(1)一个表空间(TableSpace)由多个段(Segment)构成;
(2)一个段(Segment)由多个区(Extent)构成;
(3)一个区(Extent)由多个页(Page)构成;
(4)在页中,以记录为单位,存储表的信息。例如数据段对应的页中,每条记录对应表的一个元组数据。
二.表空间的扩张
1.如果一个区的所有页面都满时,要继续插入记录就需要申请新页面,扩张表空间。
2.每次表空间的扩张是以一个区(Extent)为单位,即每次扩张申请固定数量的区。原因是:为了便于连续读写,尽量让大数据存入一个区的连续页中,避免存入不同区的页中;以区为单位一次能申请到多个页,一个页存不下一段大数据,也能让剩余部分存入相同区的相邻页中。
-
页面组织
页面中存储的一条条记录就是最终的表数据,决定页面该以何种方式存储一条条记录就是页面组织。
一.定长记录
1.概念
定长记录要求记录中所有属性都是定长类型的。
2.页面内组织形式
记录上下页面在该区中的偏移量,以此来记录上下页面的位置。
3.增加记录
如果页面能容纳新纪录,则添加到页面的最后。
4.删除记录
定长记录的页面,其记录删除有四种组织方式
(1)删除记录,并依次将后续记录向前移动
(2)删除记录,并将最后一条记录移到当前的因删除而空出位置
(3)使用链表记录空闲位置,插入记录时可快速定位第一个空位
(4)使用Bitmap(最佳选择)
二.变长记录
1.概念
变长记录要求记录中有变长属性,但也可以同时存在定长属性。
2.页面内组织形式
(1)由于每条变长记录的长度不同,因此在页面内位置无法单元化,所以无法用bitmap来记录页面位置。
(2)变长记录采用slot来记录页面内每条记录的位置和每个空闲空间的位置,每个槽位记录的信息对应一条记录或一个空闲位置。slot = 起始位置 + 长度(或叫偏移量)。
(3)整个页面中,槽位从前往后存,每个槽位对应的记录从后往前存。形成:【槽位1,槽位2,。。。。。。,记录2,记录1】。好处是:空闲位置集中在中间,不会出现以下这种尴尬局面:【槽位1,槽位2,记录1,记录2,。。。。。。】,即没位置记录槽位了。
3.记录内组织形式
(1)对于变长字段:在一条记录内对应字段位置下存的实际上的"真实值的位置"。例如姓名字段的位置存的是"37,6",表示从该条记录的第37个字节开始,往后的6个字节就是姓名字段的真实值。
(2)对于NULL值字段:在一条记录中是以bitmap的形式来管理的。例如该条记录有5个字段,则NULL值bitmap的大小就为5,如果字段值为NULL,则在bitmap中对应位置为1,否则为0;该条记录5个字段值均不为NULL,因此NULL值bitmap是00000。
4.修改记录
如果一条记录原长为80,修改后为100,但是原位置放不下该记录,则先将原记录删除,再寻找一个大小合适的空闲位置插入。
5.增加和删除记录
删除记录是只删除该条记录对应的槽位,对该条记录的实际位置空间不做回收。
只有当多次删除后,才会去移动聚拢每条记录的位置,重排页面空间,空出空闲位置。
三.定长记录 vs 变长记录
1.对于bitmap的使用不同
(1)定长记录:bitmap用于记录一个页面中每个位置是否有记录(即是否空闲),该bitmap是页面级别的。
(2)变长记录:bitmap用于记录一条记录中每个字段是否为NULL值,该bitmap是记录级别的。
2.区别
(1)记录位置和空闲位置标识
- 定长记录:使用位图bitmap标识记录位置和空闲位置。使用索引定位记录:索引 = Page(页号) + Record(bitmap下标)。
- 变长记录:使用槽位slot标识记录位置和空闲位置。slot = 起始位置 + 偏移量。
(2)记录中对NULL值字段的表示
- 定长记录:一个字段无论是否为NULL值,都占据等长大小。
- 变长记录:使用bitmap记录字段是否为NULL值。
(3)删除和更新记录
四.页面组织思考
-
文件组织
一.概述
二.文件组织方式
1.堆表
(1)概念
(2)空闲空间管理
假设一个页面大小为8KB,那么该页面的空闲空间可能就有8KB,维护一个8KB=2^13的空闲空间需要16/8=2个字节。可如果我们采用空闲空间编码,就能实现用1个字节维护8KB的空闲空间。(255*32 = 2^8 * 2^5 = 2^13)
使用二级空闲空间数组加快查询效率,二级空闲空间数组每个槽位,是几个页面聚簇后,取它们一级空闲空间数组槽位的最大值。
2.顺序表
(1)概念
(2)增删
3.哈希表
4.B+树
5.多表聚簇
-
元数据存储
一.元数据概念
二.元数据存储
-
缓冲区
一.概述
1.缓冲区作用
2.缓冲区组成
二.缓冲区管理
1.流程
为什么日志必须同步刷入磁盘后,才可以返回提交成功,而数据和索引却可以异步刷入磁盘?
答:如果在内存中完成更新缓冲区页面、索引、日志,但未刷盘,就返回提交成功,此时断电后,数据直接丢失,无法复原,却还是返回了提交成功。但是先将日志刷入磁盘,再返回提交成功,此时断电,断电后可以根据磁盘的日志进行数据复原重做。而如果日志刷入磁盘前就断电,则不会返回提交成功,而是提交失败,此时就直接回滚。
2.缓冲区页面替换
常见的页面替换策略:
-
行存储与列存储