数据库系统原理
Database System Principles
📖这门课到底讲什么
数据库系统原理研究数据如何被可靠、高效地组织与访问:关系模型与关系代数、SQL 语言(查询、连接、聚合、子查询、视图)、数据库设计与规范化(函数依赖、范式、ER 建模)、索引与 B+ 树、查询优化与执行计划、事务与并发控制(ACID、可串行化、锁与 MVCC)、恢复机制(日志与检查点),以及分布式数据库与新式存储的初步认识。它是所有信息系统的心脏,也是少数理论(范式与代数)与工程(索引、事务、优化)结合极紧的课程。学完你应能独立完成中小型系统的数据库设计、写出高效 SQL 并读懂执行计划、解释事务隔离级别带来的现象、并为高并发场景做出合理的索引与分表方案。
🎯为什么必须学好
后端岗位面试几乎必问数据库:索引底层为什么用 B+ 树、聚簇索引与回表、最左前缀原则、事务隔离级别与 MVCC、间隙锁、慢查询优化,答不上来很难通过。考研 408 中它是独立模块。工作中绝大多数增删改查与性能问题都落在数据库层,一个不会看执行计划的工程师会写出拖垮系统的 SQL。它也是大数据与后端架构的分水岭知识。
📌核心知识清单
- 关系模型与关系代数:关系与元组、键与约束、选择投影连接除运算、关系代数与 SQL 的对应
- SQL 语言:DDL/DML/DCL、多表连接(内连、左连、自连)、聚合与分组、子查询与派生表、窗口函数、视图与存储过程
- 数据库设计与规范化:函数依赖与 Armstrong 公理、1NF 到 BCNF、无损连接与依赖保持、ER 图到关系模式的转换
- 索引与存储结构:B+ 树的查找与插入分裂、聚簇索引与非聚簇索引、联合索引与最左前缀、覆盖索引、哈希索引与全文索引
- 查询处理与优化:语法分析与执行计划、选择与连接算法的代价、基于规则的优化(谓词下推、连接顺序)、explain 与慢查询分析
- 事务与并发控制:ACID 特性、四种隔离级别与脏读不可重复读幻读、两阶段锁与意向锁、MVCC 实现原理、死锁检测
- 恢复技术:WAL 与 redo/undo 日志、检查点、崩溃恢复流程、主从复制与 binlog 的用途
- 分布式与新特性:分库分表与读写分离、CAP 与最终一致性、NoSQL 与 NewSQL 简介、索引下推与列式存储概述
✍️怎么学(可执行步骤)
- 以《数据库系统概念》(Silberschatz)为主线学理论,用《MySQL必知必会》快速上手 SQL,用《高性能MySQL》深入索引与优化
- 装一个本机 MySQL 或 PostgreSQL,导入开源数据集(官方 sakila 或 employees 示例库)连续写 SQL:每天二十道查询题,从单表到多表关联到窗口函数
- 对每条重要查询跑 explain,观察 type、key、rows、Extra 字段,人为去掉索引制造全表扫描并对比耗时,训练索引直觉
- 做两个事务实验:开两个会话复现脏读、不可重复读、幻读与死锁(如两个事务交叉更新),记录现象与解决方式;再做一个百万行表的索引优化对比实验
📚推荐教材与书籍
数据库理论最权威教材,重点关系模型与代数、SQL、规范化、事务与并发控制章节
薄而实用,三十个章节快速掌握 SQL 常用查询,适合第一周读完上手实操
索引与查询优化必读,第5章索引、第6章查询性能、第8章优化器深入讲解
讲透 InnoDB 的 B+ 树索引、事务与锁、MVCC 与日志机制,面试深挖时的知识来源
🎬视频课程 / 公开课
中国人民大学与哈工大版本为佳,与国内教材考点一致
Andy Pavlo 的课程,从存储引擎到并发控制深入底层,配套 BusTub 实验含金量极高
🌐网站与文档
语法、索引、事务隔离级别与配置参数的权威参考
专门讲 SQL 索引与性能的免费在线书,含可视化 B 树演示,强烈推荐
浏览器里建表写查询,用来验证 SQL 写法与执行结果
🐙GitHub 开源资料
缓存与 NoSQL 的代表实现,学完关系数据库后读它能理解键值存储的设计取舍
MySQL 服务端源码,可查阅 InnoDB 索引与锁的实现细节
国产分布式数据库,用 Go 实现兼容 MySQL 协议,学习分布式 SQL 与存储分离设计的优秀案例
MySQL 官方示例员工数据库,三十万行数据规模,非常适合练习复杂查询与索引优化
🧪动手实践任务
实践 1
设计并实现一个图书借阅系统数据库:画 ER 图、转换关系模式、判定范式、建表加约束与索引,并写二十条覆盖增删改查与统计的 SQL
实践 2
在百万行数据上做索引优化实验:对同一查询分别测试无索引、单列索引、联合索引(不同列顺序)的耗时与执行计划,输出对比表与结论
实践 3
用两个会话复现三种并发异常并解决:脏读、不可重复读、幻读各写一组实验步骤,并说明如何用隔离级别或锁避免
实践 4
用 explain 分析十条慢 SQL,逐条给出优化方案(加索引、改写子查询为连接、避免函数作用于索引列),并记录优化前后耗时
🧾考试与面试
💼 面试会怎么考
高频:为什么索引用 B+ 树而不是 B 树、哈希或红黑树;聚簇索引与非聚簇索引的区别与回表过程;最左前缀原则与索引失效的常见情形(函数、类型转换、模糊前缀);事务的隔离级别与各自可能出现的问题;MVCC 如何实现(版本链、undo log、Read View);数据库中的锁类型与死锁排查;一条慢 SQL 如何定位与优化(开启慢查询日志、explain、索引设计);分库分表后如何保证全局唯一 ID 与分页;Redis 与 MySQL 双写一致性方案。
📝 期末与考研怎么过
期末题型:关系代数表达式与 SQL 互译、SQL 编写(连接加聚合加子查询)、范式判定与分解、ER 图设计、B+ 树与文件组织计算(块数、查找次数)、事务调度与冲突可串行化判定、并发与恢复流程分析。备考要点:SQL 与关系代数各刷二十道题、范式和 B+ 树计算背熟模板、事务调度图动手画。目标期末八十五分以上。
⚠️ 常见坑
- 写 SQL 只求结果正确不管性能,习惯用 select * 与笛卡尔积式连接,线上就是慢查询源头
- 只背索引概念不用 explain 验证,不知道自己的查询是否走索引,面试被追问索引失效场景答不出
- 把范式理论当纯考试内容死记,不理解反范式化在真实设计中的必要性(读多写少的宽表)
- 混淆隔离级别与锁的层次,说不清 MVCC 与锁如何配合,深入问题直接暴露知识断层
- 不备份不写事务,做课程项目时误删数据无法恢复;应养成建库先写脚本、改数据先备份的习惯