一、物理存储介质
- 易失性存储
DRAM
随机访问、字节寻址 - 非易失性存储
SSD
顺序访问
块/页寻址
对于非易失磁盘HDD,顺序访问的效率显然更高,因为只要访问连续的磁盘块,只需要对第一个磁盘块的寻道时间;而随机访问每次都要进行重新寻道。
对于SSD,理论上随机访问和顺序访问是一样的,但实际上顺序访问仍然有明显优势(缓存友好、预读友好)
二、DBMS存储系统
核心设计目标:
允许DBMS管理体量远超内存空间的数据库实例
需要解决的问题:
- 如何在磁盘上组织数据库的内容
- 如何管理内存和磁盘间数据的交换?
三、磁盘上的文件存储
数据库实例在DBMS里存储为一系列文件。
概述
4种存储方式:
- 堆文件组织
- 顺序文件组织
- 散列文件组织
- 多表聚簇组织
堆文件
是一系列Pages的集合,一个page存储一系列元组
读写pages时候如何快速定位?
- 链表堆文件
- 目录堆文件
面向列的存储方式
事实上,行存并不是db的标准。针对不同的需求,数据可以有不同的存储方式。
-
OLTP
简单独写少量数据
通常只涉及一个或者少量元组 -
OLAP
读取大量数据,涉及大量元组
(适合列存)
四、缓冲池(内存和磁盘间数据如何交换?)
DBMS如何管理内存和磁盘间数据的交换?
目标:减少CPU等待,最大化顺序访问
- 空间管理
- 页面写至磁盘何处?
- 局部性原则:同时访问的页面物理位置尽可能近
- 时间管理
- 页面何时读入内存
- 何时写至磁盘
- 最小化磁盘读取引起的停滞
缓冲池管理器
结构
因为磁盘读写的基本单位是页面(Pages) 缓冲池的基本单位也是Page 这里叫做帧
缓冲池里存了一系列的页面,为了快速对这些页面进行访问,还需要在缓冲池里维护另外一个结构——页表 (也就是目录) 记录页面id对应的内存地址。
页表除了存地址,还记录页面的额外元数据:
- 锁
用于维护页面的一致性。当线程更改了某页面时,告知存储管理器将页面写回磁盘。 - 大头针(计数器)
记录当前访问该页面的线程数。
不为0的时候,存储管理器不能将其写回。 因为此时页面还在被使用,写回那就有线程找不到这个页面了…
页表 vs 页面目录
帧分配
对于有限空间的缓冲池,如何决定哪些页面何时放入页面?
- 全局策略
针对DBMS的全局负载和所有活跃事务安排内存空间 - 局部策略
针对当前事务安排内存空间提高当前事务的效率,而不考虑全局负载、并发的其他事务 - 混合策略(多数DBMS)
优化设计
- 多缓冲池
- 预取
- 共享游标
- 略过 (不用缓冲池)
- OS页面缓存(直接使用OS的缓存机制,而不是再DBMS上重新设计一套)
帧逐出算法(页面置换算法)
- LRU
- 时钟置换(CLOCK)
- MRU
- LRU-K (K个时间戳)