【学习笔记1】数据库中的文件结构

数据库系统存储目标认知

数据库系统通常都是运行在文件系统之上,数据以DB特定的格式存储在文件中以供数据库系统检索、修改,那这些文件通常是如何组织的呢?

图1: 数据库系统层次

数据存储在存储设备上,数据库系统为了能高效管理数据则有两个方向的考虑:

  1. 数据库应用需求。针对不同的应用场景,可以特定的优化数据库。例如OLAP请求通常检索数据的少数列多数行,因此应该使用使用列式存储;OLTP类请求通常对获取数据tuple的完整或者大多数属性,因此应该采用行式存储。
  2. 在数据库系统与存储设备之间有着文件系统以及操作系统两层来抽象计算机系统对硬件设备的管理。数据库要达到高效管理数据的目标就要考虑存储设备的读写特性,进而采用不同的数据结构以及复杂的机制(例如缓buffer)来进行数据检索。此处衍生的问题是,优化的数据结构,优化的相应机制,系统的可靠性问题应该分别由数据库系统、文件系统、操作系统承担多少?

两种主要的存储设备访问机制:

  • 磁盘:磁盘的数据读写是以block为单位的,且存储架构越下层,其成本越低,访问延迟越高。因此数据库系统如果是基于磁盘,则优化目标应该是尽量减少磁头的转动,也就是尽量保证顺序读写。
  • 闪存:典型如SSD。特点是有并行性,随机访问性能比磁盘好,缺点是写的代价高(会有page erase)。
  • 内存:不考虑与磁盘比较的绝对性能差异下,内存的特点是随机访问性能更强。因此内存型数据库可以考虑才有特有的优化数据结构。

数据如何存储

如图2,展示了计算机系统中,各层在数据库数据存储功能上的主要职责。

图2: 各层主要职责

数据库模型中,将数据库分为三个Level:View Level,Logical Level与Physical Level。

  • Storage Devices:数据以bit的形式在物理设备上进行存储
  • Operating System:提供通用各种物理设备抽象
  • File System:负责将存储设备上杂乱的数据存储抽象为一个统一的文件,不负责管理文件中数据。
  • Database System:负责将文件中的数据映射为其数据模型,例如关系型数据库中的relation;同时数据库还会根据用户权限、设置等,将所有的数据模型对特定的用户暴露部分数据,亦即View Level。

因此,对于数据库系统,其需要按照特定的格式在文件中存储数据record,进一步设计数据结构检索其中的数据。简单的数据库系统可以直接以文件问单位来进行数据管理,从文件系统中获取到一个文件的内容,并对其进行解析获取数据。然而,如果文件过小,则将创建过多的小文件;如果文件过大,数据库系统将无法控制文件系统对磁盘的访问,导致性能较差。因为数据库的控制粒度是文件,文件内数据访问对其是透明的。

文件通常是以block为单位进行数据存储,因此数据库系统通常以block为单位来进行数据管理。block size的大小根据数据库系统的不同有不同的设置。

基于磁盘的数据库系统设计目标

目标:

  1. 数据库系统能操作大于内存限制的数据量
  2. 减少磁盘访问以优化数据库性能

实现目标1有两种途径:

  1. 直接使用操作系统mmap函数,将磁盘数据直接映射到内存中,由操作系统负责page的置出和置入
  2. 使用buffer pool,由数据库系统完全控制数据的在内存和磁盘见间的移动

方式1由于由os管理,没有数据库系统的上下文,其可能的频繁page fault置入和置出导致数据库性能degradation.

方式2由数据库系统自己完成page置换,根据上下文及特定算法,可以做到:

  • 以正确的顺序flush page
  • 大概率的prefetch
  • 更优的置换策略
  • 线程进程调度

关系型数据库文件格式

数据库系统将文件视为page的集合,根据其自己的策略管理对page的读写,进而优化page的空间利用率和局部性。page是一个固定大小的数据块,数据内容可以是tuple、metadata、索引、日志······每个page根据存储内容不同可以分为不同的page类型,并且大部署数据库系统为每个page跟配了一个唯一的id,并使用某种映射将page id映射到具体的物理存储位置。

一些数据库系统要求page应该是self-contained

文件中page的组织方式:

  1. heap file organization
  2. 序列化文件组织
  3. hash文件组织

heap file organization

在heap file中,page是无序存储的,page中的record也是无序存储的。在heap file组织中,需要一定的metadata来指示哪些page是空闲的,哪些是存储了数据的(类似磁盘管理)。此种metadata实现由两种方案:

  1. linked list:文件最开始的header指示了两种类型page list的起始,每个page维护两个双向指针


    图3: heap file organization with linked list
  2. page directory:用一个bitmap来追踪当前文件中的每个page是free/occupied,此方案最大的问题是需要保证内存中该page和磁盘上该page的同步。


    图4: heap file organization with page directory

sequential file organization

序列化文件组织并不是以page为单位来进行record的存储,而是直接以record为单位在文件中存储record。序列化文件组织和cluster index比较相关,在此文件组织中,record很具某一个search key的大小顺序在文件中进行存储。record的存储并不是严格的按序存储,而是在每一条record中会有metadata指示其下一顺序数据的位置,如图5所示。


图5: sequential file organization

当然,此组织的文件的插入和删除代价较高。因此如图5,如果在插入时,如果一个page中有空闲的空间,直接插入该位置,如果该page没有空间,则将新record插入overflow page中。

page格式

图6: 通用page格式

如图6,header通常包含的metadata有:

  • page size
  • checksum
  • DBMS version
  • transaction visibility
  • compression information

note: Oracle要求page是self-contained

page内存储records有两种类型:

  1. tuple-oriented
  2. log structure

tuple-oriented--slotted pages

如图7,在page内使用十一个array保存每条record的位置和size,array从低offset向高offset增加;record存储从过年高offset向低offset增加。

图7: slotted page

log-structured

在page中存储操作日志,根据日志重新构建数据。此结构的兴起源于当前某些系统是append-only的,适合此种文件格式。

文件内record管理

以关系型数据库为例,关系型数据库中以record为单位进行数据存储。关系型数据库进行record存储管理时通常有两个假设:

  1. 每条record的大小小于等于block size
  2. 一条record不会跨block存储

record的格式通常为header(metadata)+data,根据data部分的存储格式不同,可以划分出两种谁方案:

  1. 定长record
  2. 变长record

定长record

定长record中每条record的size大小都是固定的,因此可以使用固定的size*num得到一条record在page中的偏移量。删除时可以使用标记删除的方式来标记一条record无效。如图8,通过linked list的方式形成一个free list来管理page中空闲的存储空间。

图8: 定长record

变长record

变长record中,每条record的长度是不固定的,因此需要解决两个问题:

  1. 如何准确得分离每一个attribute
  2. 如何在page中找到一条record(结合slotted page)
图9: 变长record的格式

问题2上一节已经描述,针对问题1,解决档案如图9所示。在变长record格式中,不区分定长attribute和变长attribute,统统视为变长attribute。在record的header中有定长的信息段存储了每个属性的(offset, length),通过这个组合就可以找到每个属性的值。

同时,在这里还显示了null map的作用。使用一个bitmap来即可表示出当前tuple中哪些属性是null的。(也是可以用于定长record的格式中的)

注意:在关系代数中,tuple应该是attrubute的无序集合,也就是说属性应该不是排序的,但是在工程实现中,通常存储时是按照create table时指定的先后顺序存储的。

参考:

CMU 15-445/645 03
《Database System Concepts 7th editon》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355