4、存储引擎
volatile(易失的,断电就丢失):按照字节存储
non-volatile(非易失,比较稳定):是按照块进行存储,不是按照字节进行存储。硬盘之类的
在各层之间还有其他的
顺序存取和随机存取
读取数据:顺序存取更快,尽可能把随机的转为连续的。
DBMS:在磁盘中数据的存储如Disk所示,会存在一个类似于目录的块,后面则以page的形式存在,每个page都会在目录中对应一个索引。
而加载的时候则是分批次进行加载,需要哪一块的内容则将哪一块的对应的page加载到memory之中。
数据库存储的两大问题:
1.数据库的数据落到磁盘上是怎么表现的?
file storage:存在磁盘中的一个或者多个文件之中,操作系统不知道文件的内容 。一块数据(元组,索引,日志)hardware page(磁盘中的页,通常4k)OS page(操作系统的页,通常4k)database page(512b-16k),
page layout:包含一个header和data
用slotted尽可能的利用空间
tuple layout:二进制的字节
数据存储之间没有分隔
log-structured file organization:tuple中存的不是数据,插入删除更新都是加入log标明我已经对数据进程操作;如果要读一条数据,则需要进行数据的回放,从最下面往最上面进行推断。但是效率比较低,因此会周期性的压缩这些log,第二张图片就是压缩的结果。
可进行合并压缩,将随机的写更改为连续的写。
2.数据库如何管理数据在内存和磁盘之间的流动?浮点型不够精确
Numeric:
如果数据太长了(溢出),那么会新开一个溢出页进行存储 也可以存储外部文件,链接到该字段(外部文件内容不稳定,易被修改)
Database Workloads
On-Line Transcation Processing(OLTP):快速操作,读取更新小的数据量(高并发)。
On-Line Analytical Processing(OLAP):复杂的记录,需要大量的计算。
Hybrid Transaction + Analytical Processing(HTAP):事务处理和分析处理的混合
Bifurcated Environment:![](https://i-blog.csdnimg.cn/direct/cff6c83971c74b33bb88a25913230f0f.png)
小的数据库做事务性的任务(按行存(插入更新很快,但是如果要扫描一整列则开销很大)的数据更适合事务性,这些行组成一个page),大的数据仓库做分析。
数据在数据库中不一定按照列或者行存储,只是用户需要查询出行列的形式便于观察
按行存(插入更新很快,但是如果要扫描一整列则开销很大)的数据更适合事务性,这些行组成一个page
按列存(DSM),对数据分析更便利,对于查询和压缩好。点查询难,更新难难以划定索引。两种方式建立索引,1.直接规定第一个坑是谁第二个是谁 2.对每一个列都进行索引
5、Buffer Pools(缓存池,内存池)
数据库如何管理数据在内存和磁盘之间的流动?
空间控制(Spatial Control):把用户常用的数据集中放在缓存池中,快捷存取
时间控制(Temporal Control):最大限度的减少用户在读取数据的时间;什么时候把页读取到内存中,什么时候把内容写到磁盘上。
Buffer Pool Organization:内存中的缓存池也是一页一页分开的,称之为Frame(帧)。内存池中的一个frame对应磁盘中的一个page。需要用page TABLE去建立索引,对内存池进行索引。
Locks:逻辑上的锁
Latches(Mutex):底层的具体的
Allocation Polices:从磁盘缓存的页的放置策略,全局策略(统一安排缓存的页),本地策略(对每个页都进行不同的安排)
提高缓存池性能的策略:
1.多缓存池,即存索引的有单独内存池,存数据的有单独的缓存池,将不同的类型分开。
2.Pre-Fetching(预先缓存):
3.Scan Sharing:若俩语句读一个表,那么可以进行同步扫描,把结果直接进行共享。Q1先进行扫描,当1到page3时Q2进场(发现Q2的执行和Q1是一样的),那么就直接先让Q2跟着Q1一起进行,当两者共同部分结束时,Q2再去执行剩余。但是如果限制前100,会产生不同的结果,不能确保从哪一条开始计算。
4.BY Pass:扫描的数据不进内存池,放在内存中一块区域,用完即丢。
5.OS Page Cache:操作系统也会缓存数据库的文件,一般需要绕过操作系统的缓存。因为冗余,操作系统不知道怎么淘汰不需要的数据,难以优化。
因此需要进行绕开。
Buffer Replacement Policies(替换缓存策略):快准狠
Least-Recently Used(LRU,最近最久替换):机械的去除老的,但是老的page也可能是最重要的。
Clock,根据ref的值进行判断,ref=1则判断被读取,然后就ref变成0,即不断地周期循环
LRU-K:记录前K词的读取,分析出规律,看是否是热点page。
Localization:与自己语句相关的进行驱逐,与自己无关的不驱逐。
Priority Hints:告诉缓存池这个page很重要,即权重很高,不要轻易清理。
Dirty Pages:改了页,但是没有存。内存和磁盘中不一致
如果发现dirty了,内存池则不能清理,写到磁盘。刷脏:内存往磁盘写。刷脏不能早于日志,先写日志。