专栏内容:
postgresql内核源码分析
手写数据库toadb
并发编程
个人主页:我的主页
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.
数据库的物理存储层
简介
数据库的数据,在物理介质上的存储,在不同应用场景下采用不同存储方案,大致有内存和磁盘两类。
对于磁盘持久存储方案下,常采用文件的方式,来对应逻辑结构。
物理存储的分类
内存存储
在这种方式下,数据都是在内存,或者高速cache中,它的目的是访问速度非常快,修改频次可以非常高。
但是带来的影响是,数据不会持久化保存,关机数据丢失。采用内存存储的方式,优点很明显,同样缺点也是很明显。
对于缺点的补充,又采用分布式多副本策略,来提高业务的持续性,同时也能继续保持优点。单纯采用此类存储方式的数据库,一般都会作为中间层来使用,作为一个数据缓存层,提高并发访问能力,尤其对于高频写入或修改,同时又需要大量查询。
后端又会再接入其它持久化类型的数据库,作为最终数据存储数据库。
磁盘存储
在这种方式,将数据直接写入磁盘,当然会产生大量的IO。
使用此方式的场景通常是
对于数据可靠性要求非常高,单位数据价值非常高,那么必须实时落盘持久化;
对于大数据场景,内存存不下海量数据,只能落盘,而且数据实时性要求不高,比如数据统计分析,可以先存下来,再分析;
混合型存储
混合型指即持久化数据,又兼内存型的访问快的优点。大致可以分析两类:
偏内存型的;数据常驻内存,同时会采用策略写入磁盘,在掉电等故障下,可以从磁盘再次加载数据到内存;
综合型的;内存中会存储最新数据,采用顺序写磁盘记录redo日志,同时数据也会在不影响访问情况下写到磁盘;此种模型下,内存充当数据缓存区的作用。
文件存储
下面对于物理存储下,文件的组织形式和格式进行分析。
- 每个表对应一个或多个文件,也就是不同的表用不同的文件来存储;
- 文件类型与逻辑数据库对象有对应管理,比如存储表的文件,存储索引的文件;
文件内容
拿表文件来说,文件内容包括类型信息,还有文件内的数据组织信息,以及表的行数据;
- 文件内容是二进制形式
- 文件以块为单位进行划分,当然块大小最好与文件系统的块对齐或小于文件系统的单位;
- 数据块也有不同的类型和内部的组织形式
行存储
行的删除策略
策略种类
对于删除行后的存储空间管理,大致有三种方面,比如删除第n行
- 将n+1… i 移动到 n … i -1 的位置
这样空闲空间就一直在最后- 将n的位置留下,也一次i+1插入时占用,此种情况需要行的size固定
- 将n的位置留下,以后将n+1删除后,使用空闲空间的链表串起来,统一进行整理
利弊比较
- 第一种策略,行size不需要固定,空间管理简单,对于删除操作,内存拷贝较大;对于插入就非常简单,查找也就容易;
- 第二种策略,对于行的size就要固定,否则空洞区域很难被利用;当然行size固定后,就有很多限制,同时带来一定空间浪费;
- 每三种策略,空间管理较复杂,插入和删除比较简单,但是对空闲空间管理,需要额外进行处理,易带来存储的膨胀,对于查询会带来 读/写 IO放大,少量数据的空间需要进行读写;
结尾
非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!
作者邮箱:[email protected]
如有错误或者疏漏欢迎指出,互相学习。
注:未经同意,不得转载!