DBMS-4 数据库存储

发布于:2024-10-15 ⋅ 阅读:(114) ⋅ 点赞:(0)

本文章的素材与知识来自李国良老师。

  • 存储结构

一.表空间

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.缓冲区页面替换

常见的页面替换策略:

  • 行存储与列存储

一.概述

二.比较

三.适用场景


网站公告

今日签到

点亮在社区的每一天
去签到