Slotted-Page简介与定长记录的SSD页式存储

首先介绍下传统硬盘的一种动态分配空间的页式存储数据结构:Slotted-Page structure(分槽页结构)

它具有以下特点:

1. Records(记录)顺序存储(从块的头部/尾部)

2. 有顺序添加的指针指向每条记录的起始位置(从块的尾部/头部)

3. 记录可在页中移动位置

 

如图所示,页尾存有指向每一个记录起始位置的指针。

当有一条新纪录插入时,它会顺序加到图中52的后面,同时尾部也多加一个指向这条新纪录的指针。

当有一条记录删除时,系统会释放该空间,移除相关的信息指针,后续记录可往前填补这个空隙。

 

假设我们的数据库系统只用定长的记录(fixed length records)存储。对于传统硬盘来说,上述的slotted-page方法就是一种可行的方案。

如果要用SSD来存储,该如何设计呢?

首先简单介绍下SSD:

其中的闪存(flash)分为一个或多个dies(chips),每个die又分为4 * 2018 = 8192 blocks(块),每块中包含32-64页,而页就是读写的最小单元。

限制(Constraints):

Erase-Constraint:除非已擦除该页所在的块,否则无法覆盖写(over-written)该页

Write-Constraint:一个块中的页内必须从低地址往高地址顺序写

Wear-Constraint:一个块被擦除的次数是有限制的(一般10000-100000次)

 

我们可以模仿传统的slotted-page方法,只不过移除尾部原来存放指针的slotted table,这样就有额外的空间用于存储数据。

访问记录:使用线性寻址(用页内记录的索引slotID计算每个记录的偏移量)。例如假设每个记录16字节,那么 Offset = 16 * slotID

删除记录:当一个记录被删除时,该位置会被存储于一个专门存储删除记录位置的页(State Index Page)。该页存储指向所有无效记录的指针。当访问一条记录时,必须先在SIP页里搜索该地址是否有效。

更新记录:更新 = 删除 + 插入。对每次更新来说,新纪录会被插入到一个新的位置,旧记录的地址会被加到SIP页中,被标记为无效。

 

垃圾回收的三种情况:

1. SIP页中没有空间了。

2. 周期性进行垃圾回收

3. 一页中 无效记录/所有记录 > threshold(例如70%)

发生垃圾回收时,原页中所有有效的记录会被移动(添加)到另一个有足够空间的页中,原页就可重新使用了。

posted @ 2020-03-05 02:51  厚植根本  阅读(771)  评论(0编辑  收藏  举报