跳到正文

第6章学习笔记:存储、页、缓冲与索引

课程笔记

沿字节—记录—页—文件—缓冲池理解数据怎样落盘,并计算索引与 I/O 成本。

关联:章节 第6章 存储、页、缓冲与索引

第6章笔记:存储、页、缓冲与索引

本章不是七个并列名词

沿字节—记录—页—文件—缓冲池理解数据怎样落盘,并计算索引与 I/O 成本。 学习顺序从《记录布局与变长字段》开始,到《聚簇、覆盖与复合索引设计》闭合。每一节都要留下下一节能直接使用的对象:模式、关系、查询结果、页、计划、事务状态、日志记录或部署证据。若你只能逐条背定义,却说不清前一节输出怎样成为后一节输入,这一章还没有真正连起来。

七节依赖与例题

1. 记录布局与变长字段

要解决的问题: 定长字段便于定位,变长字段常通过偏移表组织;NULL 位图、对齐和版本信息都占空间。

跟着做: 一条用户记录含 id、状态、昵称和简介时,页内可保存固定头与变长区偏移,更新简介可能触发行迁移。

验收规则: 记录大小 = 固定头 + NULL 位图 + 定长区 + 偏移数组 + 变长数据 + 对齐开销。

2. 页与槽式页面

要解决的问题: 数据库以页为主要 I/O 单位;槽目录让记录在页内移动而稳定 RID,删除后可压缩空洞。

跟着做: 8 KiB 页底部增长记录区、顶部增长槽数组;更新变长记录时只改槽偏移,上层索引仍引用同一槽号。

验收规则: RID 常写作 (page_id,slot_id),可用空间必须扣除页头和每条槽项。

3. 文件组织与堆表

要解决的问题: 堆文件插入快但无序扫描;有序文件范围查询好却维护昂贵;组织方式必须匹配主要工作负载。

跟着做: 事件日志持续追加适合堆表加时间索引,若强行按用户排序会让每次插入都寻找位置并移动数据。

验收规则: 全表扫描 I/O 约为数据页数 B;点查堆表平均可能接近 B/2 页。

4. 缓冲池与替换策略

要解决的问题: 缓冲池缓存磁盘页,pin 防止正在使用的页被淘汰,dirty 页写回需遵守日志先行;命中率不是唯一目标。

跟着做: 顺序扫描可能污染小型 LRU,使热点索引页被逐出;可用 scan-resistant 策略或独立池。

验收规则: 有效访问时间 EAT ≈ h·t_mem +(1−h)·t_io,且脏页淘汰还增加写 I/O。

5. B+ 树结构与范围查询

要解决的问题: B+ 树内部节点只导航,叶节点保存有序键并串联;高度低、范围扫描连续,是通用磁盘索引。

跟着做: 在 (dept_id,salary) 索引上查某部门薪资区间,可先定位首叶再沿叶链扫描;只查 salary 不能利用左前缀定位。

验收规则: 高度约为 ceil(log_f N),一次点查 I/O 约为树高加数据页访问。

6. 哈希索引、位图与适用边界

要解决的问题: 哈希擅长等值但不支持有序范围;位图适合低基数分析列,却不宜承受高并发逐行更新。

跟着做: status='paid' 的仓库分析可用位图组合,用户邮箱等值查可用哈希;按邮箱前缀范围则需有序索引。

验收规则: 索引选择取决于谓词形态、基数、更新率和并发模式,不是越多越快。

7. 聚簇、覆盖与复合索引设计

要解决的问题: 聚簇决定相邻键是否物理接近,覆盖索引可避免回表;复合索引顺序由等值、范围、排序与选择率共同决定。

跟着做: 查询 WHERE tenant_id=? AND created_at>? ORDER BY created_at 可用 (tenant_id,created_at);附带 status 可能形成覆盖。

验收规则: 收益必须减去写放大、空间和维护成本;用真实计划与统计数据验证。

章内共同推理方法

先写“一行或一个状态代表什么”,再写它必须满足的键、约束、顺序或故障假设。遇到 SQL,先定结果粒度和重复/NULL 语义,再编码;遇到存储与优化,先估算页数、基数和 I/O,再看真实执行计划;遇到事务与分布式,先画时间线和允许历史,再讨论隔离级别、日志或共识。任何公式都要带单位、数据分布和适用边界。

可复现练习

从本章七个例题中任选两个,用 SQLite 或课程给定模型从空环境重做。保存建表/输入、执行步骤、实际输出和断言;随后故意加入一个重复键、NULL、并发交错、崩溃点、倾斜分布或网络分区,记录第一个被破坏的不变量。只截成功界面、只贴 SQL 或只报告耗时不算完成。

闭卷验收

用十分钟画出本章七节箭头图;任选一条箭头解释传递的具体字段、状态或证据。再为《聚簇、覆盖与复合索引设计》写一个最小失败案例,并追溯它需要《记录布局与变长字段》中的哪条定义才能修复。最后列出三道题:一道唯一答案判断、一道多条件选择、一道必须计算或写 SQL/状态轨迹的问题,且每题都写清为什么其他答案错。