PPT 05 数据库存储
5. PPT 05 数据库存储:数据库为什么总在数 block¶
这一章以 第九章 数据存储.docx 为主要讲解来源。PPT 给了存储层级和 buffer 的骨架;Word 笔记补足了磁盘访问、记录组织、分槽页、文件组织、buffer manager、LRU/MRU 等细节。
先抓住一句话:
所以后面查询处理、索引、join cost 全都建立在这里:
5.1 易失和非易失:内存快,但断电会忘;磁盘慢,但能留下¶
Word 笔记把物理存储分成两类:
数据库最关心三个指标:
层级越靠近 CPU:
层级越靠近磁盘/备份:
DBMS 的基本动作就是:
5.2 磁盘为什么怕随机访问¶
传统磁盘不是“直接拿到数据”,而像唱片机。
一次读盘大致包含:
前两步是机械等待,常常比真正传输还贵。
所以:
这解释了后面很多反直觉结论:
5.3 block/page:做题时先把 tuple 数换成 block 数¶
内外存传输以 block 为单位。
哪怕你只要读一个整数:
所以题目给:
你先算:
其中 \(f_r\) 是 blocking factor(一个 block 能放多少条记录),\(b_r\) 是关系 \(r\) 总共占多少 block。
例子:
先算:
后面无论是全表扫描、B+ 树、join,第一步都别忘了把 tuple 数转成 block 数。
5.4 定长记录:位置可以直接算¶
定长记录的好处是简单。
如果每条记录长度是 \(n\) bytes,那么第 \(i\) 条记录从偏移 \(n \times (i - 1)\) 开始。
例子:
一个 block 最多放 \(\lfloor 4096 / 100 \rfloor = 40\) 条。
剩下 96 bytes 宁可浪费,也常常不让一条记录跨两个 block,因为跨块会让一次读取变成两次读取。
删除定长记录有三种做法:
做题看到 “free list”,就想到第三种。
5.5 不定长记录:前面放目录,后面放真实内容¶
varchar 这种字段长度不固定。如果全部按最大长度存,会浪费空间。
所以不定长记录常用这种结构:
null bitmap 是一串 bit:
这样数据库不用给 NULL 字段浪费完整空间。
5.6 分槽页 slotted page:页头管目录,页尾放记录¶
不定长记录放进一个 block/page 时,常用分槽页结构。
画面是:
为什么要这样?
这就是“页内小目录”的思想。
5.7 文件组织:新记录到底插到哪一页¶
一个表通常由很多 page 组成。插入一条记录时,DBMS 要决定:
常见组织方式:
heap file:哪里有空放哪里。
sequential file:按某个 key 保持顺序。
B+ tree file organization:叶子节点直接存记录本身。
hash organization:按 hash 值分桶。
clustering / multi-table organization:相关表的数据靠近放。
heap file 的关键问题是找空位。Word 笔记提到可以在第一页维护每个 page 的空闲程度,例如用几个 bit 表示:
如果页很多,还可以做第二层目录:
这和多级索引的思想类似:先粗略定位,再精确找页。
5.8 Buffer manager:内存里的临时书桌¶
上层查询想访问某个 block 时,会先问 buffer manager:
如果在:
如果不在:
被修改过但还没写回磁盘的页叫 dirty page。
替换 dirty page 时,不能直接丢:
没有修改过的 clean page 可以直接丢。
5.9 Pin count:正在被用的页不能踢走¶
如果上层操作正在读某个 page,buffer manager 不能把它替换出去。
所以有 pin:
替换页时,只能考虑:
的页。
如果多个程序同时读写同一个 buffer page,还要考虑并发冲突:
这就和后面的锁机制连起来了。
5.10 LRU、MRU、Clock:替换谁不是永远固定¶
LRU:
直觉:
MRU:
MRU 什么时候有用?Word 笔记提到嵌套循环场景:内循环刚扫过的最后一页,下一轮可能最后才会再用;而内循环最早扫过的页,下一轮马上又会用。此时简单 LRU 可能不理想。
Clock 是 LRU 的简化实现:
5.11 SSD/闪存:读按页,写前常要擦¶
Word 笔记对闪存强调两点:
热数据如果老写在同一物理位置,会把那块磨损得很快。
所以 SSD 会做磨损均衡:
5.12 存储题 A4 规则¶
DB 读写以 block/page 为单位,不以 tuple 为单位。
随机 I/O 贵,顺序 I/O 便宜。
fr = floor(block_size / record_size),br = ceil(nr / fr)。
定长记录可直接算偏移;删除可移动、尾记录填洞、free list。
不定长记录用 offset/length/null bitmap 管理。
slotted page:页头 slot directory,页尾放真实记录。
dirty page 被替换前必须写回;clean page 可直接丢。
pin count > 0 的页不能替换。
LRU 不是永远最好;某些循环扫描中 MRU 可能更合适。
Clock 用 reference bit 近似 LRU。