数据库系统
数据库系统(Database System)是现代计算基础设施的核心组件之一。数据库管理系统(DBMS)为数据的持久化存储、高效查询、并发访问和一致性保障提供了统一的抽象层。从传统的关系型数据库到新兴的 NoSQL、NewSQL 以及 AI 工程中广泛使用的向量数据库,数据库技术的演进始终与应用需求紧密结合。
本笔记覆盖数据库系统的核心知识点,包括关系模型、事务管理、索引机制、查询优化、NoSQL 范式以及数据库在 AI 领域的前沿应用。
1. DBMS 分类
| 类型 | 数据模型 | 代表系统 | 典型应用场景 |
|---|---|---|---|
| 关系型(RDBMS) | 表(行与列) | MySQL, PostgreSQL, Oracle | OLTP、企业应用、金融系统 |
| 文档型 | JSON/BSON 文档 | MongoDB, CouchDB | 内容管理、用户画像、日志 |
| 键值存储 | Key-Value 对 | Redis, DynamoDB | 缓存、会话管理、实时计数 |
| 列族存储 | 列族(Column Family) | Cassandra, HBase | 时序数据、大规模写入 |
| 图数据库 | 节点与边 | Neo4j, Amazon Neptune | 社交网络、知识图谱、推荐 |
| 向量数据库 | 高维向量 | Pinecone, Milvus, Weaviate | 语义搜索、RAG、推荐系统 |
OLTP vs OLAP
- OLTP(联机事务处理):高并发、短事务、行存储为主(如 MySQL)。
- OLAP(联机分析处理):复杂聚合查询、列存储为主(如 ClickHouse、Snowflake)。
- 现代趋势是 HTAP(混合事务/分析处理),如 TiDB。
2. 关系模型与 SQL
2.1 关系代数
关系代数是关系型数据库的理论基础,定义了对关系(表)进行操作的代数系统。
| 运算 | 符号 | 含义 |
|---|---|---|
| 选择(Selection) | \(\sigma_{\theta}(R)\) | 从关系 \(R\) 中选出满足条件 \(\theta\) 的元组 |
| 投影(Projection) | \(\pi_{A_1, A_2, \dots}(R)\) | 从关系 \(R\) 中选出指定属性列 |
| 并(Union) | \(R \cup S\) | 两个关系的并集 |
| 差(Difference) | \(R - S\) | 在 \(R\) 中但不在 \(S\) 中的元组 |
| 笛卡尔积 | \(R \times S\) | 两个关系的笛卡尔积 |
| 自然连接 | \(R \bowtie S\) | 基于共同属性的等值连接并去重 |
| 除(Division) | \(R \div S\) | 商运算,用于"全称量词"类查询 |
示例:查找选修了所有课程的学生
2.2 SQL 基础
SQL(Structured Query Language)分为三大子语言:
DDL(数据定义语言):
CREATE TABLE Students (
sid INT PRIMARY KEY,
name VARCHAR(64) NOT NULL,
gpa DECIMAL(3,2) CHECK (gpa >= 0 AND gpa <= 4.0),
dept_id INT REFERENCES Departments(dept_id)
);
DML(数据操纵语言):
-- 子查询 + 聚合
SELECT dept_id, AVG(gpa) AS avg_gpa
FROM Students
GROUP BY dept_id
HAVING AVG(gpa) > 3.5
ORDER BY avg_gpa DESC;
DCL(数据控制语言):
GRANT SELECT, INSERT ON Students TO role_readonly;
REVOKE INSERT ON Students FROM role_readonly;
3. 事务与并发控制
3.1 ACID 属性
| 属性 | 含义 | 实现机制 |
|---|---|---|
| Atomicity(原子性) | 事务要么全部执行,要么全部回滚 | Undo Log |
| Consistency(一致性) | 事务执行前后数据库满足完整性约束 | 应用层 + 约束检查 |
| Isolation(隔离性) | 并发事务互不干扰 | 锁 / MVCC |
| Durability(持久性) | 已提交事务的结果不会丢失 | Redo Log + WAL |
3.2 隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 |
|---|---|---|---|---|
| Read Uncommitted | 可能 | 可能 | 可能 | 最高 |
| Read Committed | 不可能 | 可能 | 可能 | 高 |
| Repeatable Read | 不可能 | 不可能 | 可能 | 中 |
| Serializable | 不可能 | 不可能 | 不可能 | 最低 |
MySQL 的特殊行为
MySQL InnoDB 在 Repeatable Read 级别通过 Next-Key Lock 在很大程度上避免了幻读,这与 SQL 标准的定义不完全一致。
3.3 MVCC(多版本并发控制)
MVCC 的核心思想是为每个数据项维护多个版本,读操作访问快照版本,写操作创建新版本,从而实现读写不互斥。
- 每行记录隐含
trx_id(创建事务 ID)和roll_pointer(回滚指针) - 读操作根据一致性视图(Read View)判断可见性
- PostgreSQL 使用
xmin/xmax实现 MVCC,垃圾回收通过 VACUUM 完成
4. 索引
4.1 B+ 树索引
B+ 树是关系型数据库中最常用的索引结构,具有以下特点:
- 所有数据存储在叶子节点,叶子节点通过链表连接
- 树高度通常为 3-4 层,支持 \(O(\log_B N)\) 的查找
- 支持范围查询(顺序扫描叶子节点链表)
- 节点大小通常与磁盘页(4KB/16KB)对齐
B+ 树 vs B 树:B+ 树的内部节点只存储键(不存数据指针),因此扇出更高、树更矮。
4.2 哈希索引
- 基于哈希函数将键映射到桶(bucket)
- 仅支持等值查询,不支持范围查询
- 时间复杂度 \(O(1)\)(平均),但存在哈希冲突问题
- MySQL 的 Memory 引擎和 Redis 内部大量使用哈希索引
4.3 其他索引类型
| 索引类型 | 用途 | 示例 |
|---|---|---|
| 全文索引(Full-text) | 文本搜索 | Elasticsearch 的倒排索引 |
| 空间索引(R-tree) | 地理位置查询 | PostGIS |
| 位图索引(Bitmap) | 低基数列的分析查询 | Oracle Data Warehouse |
| 向量索引(HNSW/IVF) | 近似最近邻搜索 | Milvus, pgvector |
5. 查询优化
5.1 查询处理流程
SQL 查询 → 解析器(Parser) → 逻辑计划 → 优化器(Optimizer) → 物理计划 → 执行引擎
5.2 代价估计
优化器通过统计信息估计不同执行计划的代价:
- 选择率(Selectivity):\(\text{sel}(\sigma_{A=v}(R)) = \frac{1}{V(A, R)}\),其中 \(V(A, R)\) 是属性 \(A\) 的不同值个数
- 连接代价模型: - 嵌套循环连接:\(O(|R| \cdot |S|)\) - 排序-归并连接:\(O(|R| \log |R| + |S| \log |S|)\) - 哈希连接:\(O(|R| + |S|)\)(平均)
5.3 常见优化策略
- 谓词下推(Predicate Pushdown):尽早过滤不需要的行
- 投影下推:尽早丢弃不需要的列
- 连接顺序优化:选择代价最小的连接顺序(NP-hard,通常用动态规划或贪心)
- 索引扫描 vs 全表扫描:根据选择率决定是否使用索引
6. NoSQL 数据库
6.1 CAP 定理
分布式系统不可能同时满足以下三个属性(最多满足两个):
- C(一致性):所有节点在同一时刻看到相同的数据
- A(可用性):每个请求都能收到(非错误的)响应
- P(分区容错性):网络分区发生时系统仍能运行
| 系统 | 选择 | 特点 |
|---|---|---|
| 传统 RDBMS | CA | 单机部署,不考虑网络分区 |
| MongoDB, HBase | CP | 分区时牺牲可用性 |
| Cassandra, DynamoDB | AP | 分区时牺牲一致性(最终一致) |
6.2 代表系统简介
MongoDB(文档数据库):
- BSON 格式存储,Schema 灵活
- 支持丰富的查询语法和聚合管道
- 分片(Sharding)+ 副本集(Replica Set)实现水平扩展
Redis(键值存储):
- 内存数据库,支持多种数据结构(String, Hash, List, Set, Sorted Set)
- 持久化:RDB 快照 + AOF 日志
- 典型用途:缓存、分布式锁、消息队列
Neo4j(图数据库):
- 属性图模型:节点和边都可以拥有属性
- Cypher 查询语言:
MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a, b - 擅长多跳关系查询,如社交网络、推荐系统、欺诈检测
7. NewSQL 与分布式数据库
NewSQL 试图在保持 SQL 兼容性和 ACID 事务的同时,实现 NoSQL 级别的水平扩展能力。
| 系统 | 架构特点 | 存储引擎 |
|---|---|---|
| Google Spanner | 全球分布式,TrueTime | Colossus |
| CockroachDB | Spanner 开源实现 | RocksDB |
| TiDB | 兼容 MySQL 协议 | TiKV (Raft + RocksDB) |
| YugabyteDB | 兼容 PostgreSQL 协议 | DocDB |
核心技术:
- Raft/Paxos 共识协议:保证分布式一致性
- 分布式事务:两阶段提交(2PC)或 Percolator 模型
- 自动分片与负载均衡:数据按 Range 或 Hash 分片
8. AI 工程中的数据库应用
8.1 向量数据库
向量数据库专门用于存储和检索高维向量,是 RAG(检索增强生成) 系统的核心组件。
工作流程:
- 文本通过 Embedding 模型(如
text-embedding-3-small)转为向量 - 向量存入数据库并建立索引
- 查询时计算查询向量与数据库向量的相似度(余弦距离、欧氏距离)
- 返回 Top-K 最相似的结果
主流向量索引算法:
| 算法 | 原理 | 特点 |
|---|---|---|
| HNSW | 分层可导航小世界图 | 高精度、内存消耗大 |
| IVF | 倒排文件索引 + 聚类 | 精度与速度可调 |
| PQ(乘积量化) | 向量压缩 | 节省内存、精度有损 |
| ScaNN | Google 的混合量化方案 | 工业级性能 |
8.2 特征存储(Feature Store)
特征存储为 ML 管道提供统一的特征管理层:
- 离线特征:批处理计算,存储在数据仓库(如 BigQuery)
- 在线特征:低延迟服务,存储在 Redis/DynamoDB
- 特征一致性:确保训练和推理使用相同的特征变换逻辑
- 代表系统:Feast, Tecton, Hopsworks
8.3 数据库与 LLM 的融合
- Text-to-SQL:LLM 将自然语言转换为 SQL 查询
- 知识图谱 + RAG:结构化知识与非结构化文本的混合检索
- 语义缓存:基于向量相似度缓存 LLM 的响应,减少重复计算
9. 数据库工程中的常见权衡
数据库系统的核心从来不只是“会不会 SQL”,而是如何在一致性、延迟、成本、扩展性和维护复杂度之间取舍。
| 取舍 | 一端 | 另一端 | 典型问题 |
|---|---|---|---|
| 一致性 vs 延迟 | 强一致 | 更低延迟 | 写后立刻读是否必须最新 |
| 规范化 vs 易查询 | 高规范化 | 冗余/预聚合 | 联表复杂度与更新成本如何平衡 |
| 事务性 vs 吞吐 | 严格 ACID | 更高并发 | 是否真的需要跨实体事务 |
| 单库简洁性 vs 分布式扩展 | 垂直扩展 | 分片/复制 | 什么时候开始承受分布式复杂度 |
| 通用数据库 vs 专用存储 | 一套系统 | 多种系统组合 | 是否值得为搜索、缓存、向量检索拆出独立组件 |
这些权衡也解释了为什么数据库问题经常会回流到系统设计与分布式系统。很多所谓“数据库瓶颈”,本质上其实是系统边界和读写模式没有被设计清楚。
与其他主题的关系
- 参见 系统设计,理解数据库选型如何进入容量估算、缓存与服务边界设计
- 参见 分布式系统,理解复制、一致性、分片与事务在多节点环境中的影响
- 参见 云服务,理解托管数据库、对象存储与云原生数据基础设施
- 参见 全栈开发,理解应用层如何通过 ORM、迁移和 API 使用数据库
参考文献
- Ramakrishnan & Gehrke, Database Management Systems
- Silberschatz et al., Database System Concepts
- Kleppmann, Designing Data-Intensive Applications
- CMU 15-445/645: Database Systems