CSNotesCSNotes
TODO
数据库
Java
SSM
React
学习路线
分布式
Redis
实用工具
GitHub
TODO
数据库
Java
SSM
React
学习路线
分布式
Redis
实用工具
GitHub
  • 第一阶段 SQL 语法与使用

    • 一、MySQL 语法基础
    • 二、多表查询与笛卡尔积
    • 三、JOIN 类型与算法
    • 四、LIKE 通配符与正则
    • 五、GROUP BY/HAVING /窗口函数
    • 六、字段类型与选型
    • 七、约束、主键与 DDL 语法
  • 第二阶段 SQL 执行与优化

    • 一、一条建表语句是如何执行的?
    • 二、EXPLAIN 执行计划
  • 第三阶段 数据存储结构(MyDB 轮子核心)

    • 一、字符集与 CHAR/VARCHAR 存储
    • 二、最大行大小 65535 bytes
    • 三、为什么 VARCHAR 上限是 16383?
    • 四、表、页与 Page Header 概念
    • 五、InnoDB 行格式 COMPACT
    • 六、磁盘空间管理器
  • 第四阶段 索引与数据结构

    • 一、为什么是 B+ 树?
    • 二、B+ 树插入、分裂、合并的完整过程
    • 三、容量计算:一颗高度为 3 的 B+ 树能存多少条数据?
    • 四、索引分类(聚簇/二级/联合/覆盖)
    • 五、联合索引 + 最左匹配原则
    • 六、索引失效 7 大场景
    • 七、索引创建策略:三星索引法
  • 第五阶段 事务、MVCC 与并发控制

    • 一、事务
    • 二、事务的本质(内核视角)
    • 三、MVCC 多版本快照读
    • 四、死锁四条件
    • 五、一条 INSERT 语句背后在干吗?
  • 第六阶段 预写日志 WAL 与崩溃恢复

    • 一、预写日志 WAL(Redo/Undo)
  • 第七阶段 数据建模与范式

    • 一、数据建模范式(入门版)
    • 二、数据建模范式(进阶版)
  • 第八阶段 数据库概念全景

    • 一、数据库/DBMS/SQL 全景定义
  • 第九阶段 常见面试题专题(占位:待补)

四、表、页与 Page Header 概念

拿 Excel 来举例,数据库就像一张 Excel,我们可以往里面存数据和查找数据。

(一)表

表就像 Excel 里的一个 sheet 页,每张表由行、列组成。

页是被管理的,在内存中被 BufferManager 管理,在磁盘中被磁盘空间管理器管理。

页是 IO 的基本单位。

(二)页

记录有定长的和不定长的。

页包括:页号、数据、脏位、锁、页缓存。

(三)Page Header

页面头部。

(四)紧凑型

(五)非紧凑型

(六)Disk Space Manager

DBMS 的最底层

目的:

1.将页映射到磁盘上

2.从磁盘将页加载到内存

3.将页存回磁盘,保证写

高层调用这层来读/写页,分配、取消分配逻辑页。

(七)不变长记录

Record id=(Page,Location in Page)

Delete

(八)可变长记录

(九)数据库简介

事务管理器:通过 XID 文件记录事务的状态。可以快速访问和更新事务状态

8 字节、1 字节、1 字节

[00 00 00 00 00 00 00 00][01][02][01][01][00][01]

(十)为什么要有事务?

事务是为了保证一堆状态打包执行。比如说转账,扣钱和加钱要同时执行。

考虑下面情况

T1 begin
T2 begin
T2 U(x)
T1 R(x)
...
T1 commit
崩溃

由于 T1 读到了 T2 没有提交的事务。导致错误

规定 1

正在进行的事务,不会读取其他任何未提交的事务产生的数据

第二种情况,假设 x 的初值是 0

plaintext
T1 begin
T2 begin
T1 set x = x+1 // 产生的日志为(T1, U, A, 0, 1)
T2 set x = x+1 // 产生的日志为(T1, U, A, 1, 2)
T2 commit
MYDB break down

在系统崩溃时,T1 仍然是活跃状态。那么当数据库重新启动,执行恢复例程时,会对 T1 进行撤销,对 T2 进行重做,但是,无论撤销和重做的先后顺序如何,x 最后的结果,要么是 0,要么是 2,这都是错误的。

出现这种问题的原因,归根结底是因为我们的日志太过简单,仅仅记录了”前相”和”后相”. 并单纯的依靠”前相”undo, 依靠”后相”redo. 这种简单的日志方式和恢复方式,并不能涵盖住所有数据库操作形成的语义

规定 2

正在进行的事务,不会修改其他任何未提交的事务修改或产生的数据。

(十一)为什么要有日志?

可以恢复崩溃的事务。

日志规定

编辑此页
上次更新: 2026/9/18 20:24
Prev
三、为什么 VARCHAR 上限是 16383?
Next
五、InnoDB 行格式 COMPACT