Java教程

数据库的存储(上)

本文主要是介绍数据库的存储(上),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

存储结构模型

在红线之上的是volatile storage(易失存储),其需要电力支持,当断电的时候会失去存储的内容。

红线之下的是none-volatile storage(非易失存储),及时断点也不会失去存储内容,因而也可被称为持久化存储。

volatile storage的寻址方式较none-volatile storage更简单,none-volatile storage需要块地址加上字节偏移来确定一个地址。

 none-volatile的获取代价较为昂贵。

中间还插了一嘴,某种None-volatile Memory兼具二者的优势,在快速访问的同时也可以持久化存储。

接下来是各个设备的Access Time的比较。

 

访问内容的一个简单示例

  1. 执行引擎向Memory发出查询请求
  2. Memory从Disk中加载Directory(目录)
  3. Memory从Direcotry中查询page2,并将page2加载进来
  4. Memory向执行引擎返回page的指针

为什么不适用OS的内存管理机制

  • OS发生内存映射错误时耗费大量时间和资源
  • OS不清楚数据库应用打算做什么,仅仅将一切是为一连串的读写请求

 结论:不要使用M-map,让db处理自己的事情最好。

存储处理器(Storage Manager)

Storage Manager负责维护DB文件,有些甚至会预测页表的时空位置

其使用页的形式来管理文件(跟踪页的读写信息,记录空闲页)

页:一组空间固定的数据块

  • 常常包含行记录,元数据,索引,日志信息
  • 大部分系统不会混淆页的类型
  • 有些系统要求页自包含(自包含:就是页所需要的描述数据全部包含在页本身中,不需要读取其他页的内容来获取)
  • 每个页需要一个id标识(DBMS通过一个非直接方式映射页和id)

页大小

Hardware Page(一般4KB)

OS Page(一般4KB)

DB Page(512B-16KB)

链表式结构

 

 链表发存储两个链表,一个是空闲页的链表,另一个则是非空闲页的链表。

目录法

 

 维护一个特殊的Directory映射页的信息

例如Directory包含被映射页的空余空间大小

页的结构信息

页头

 

 

  • 页的大小
  • 校验和
  • DBMS版本
  • Transaction Visibility(事物可见性?)
  • 附加信息

存储结构

 

 

劣势:无法确认具体删除了那一块Tuple(即无法确认Tuple的具体位置)。

 

 

使用插槽映射tuple数据,插槽映射了tuple数据的页偏移,这样我们就可以相对随意的移动tuple的位置,因为tuple的偏移量已经存储在slot中,可以通过slot轻松获取这一信息。

slot从头部生长,tuple数据从尾部生长,当slot与tuple间无法再存储数据时,我们成为页满了。(这个好像跟Jvm的部分内存分配策略有异曲同工之妙)

 

这篇关于数据库的存储(上)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!