面试题精讲:数据库
1. 数据库事务 (Transaction)
面试核心: ACID 特性。
- A (Atomicity) 原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败回滚。
- C (Consistency) 一致性:事务执行前后,数据库从一个一致性状态转换到另一个一致性状态。
- I (Isolation) 隔离性:多个并发事务之间相互隔离,互不干扰(通过锁和 MVCC 实现)。
- D (Durability) 持久性:一旦事务提交,对数据的修改就是永久性的。
2. 数据库索引与 B+ Tree
面试核心: 为什么 MySQL 选择 B+ Tree 而不是二叉树或 B-Tree?
- B+ Tree 优势:
- 磁盘读写代价更低:内部节点不存放数据,只存放索引,一个节点能容纳更多索引,树更矮胖。
- 查询效率稳定:所有数据都在叶子节点,任何路径长度相同。
- 范围查询极强:叶子节点之间有双向链表连接。
- 聚集索引 vs 非聚集索引:
- 聚集索引:索引的叶子节点就是行数据(通常是主键)。
- 非聚集索引:叶子节点存储的是主键值(回表查询)。
3. Redis 核心原理
面试核心: 为什么单线程还这么快?持久化怎么做?
- 快的原因:纯内存操作;IO 多路复用机制(epoll);单线程避免了上下文切换和竞争锁。
- 数据结构:String, Hash, List, Set, ZSet(跳表实现)。
- 持久化策略:
- RDB (快照):定时全量备份,恢复快,但易丢数据。
- AOF (追加日志):记录每个写指令,数据安全性高,但文件大、恢复慢。
- 混合持久化 (Py 3.x 时代主流):RDB 头 + AOF 尾。
4. 悲观锁 vs 乐观锁
面试核心: 场景选择。
- 悲观锁:先取锁再访问。适用于写多读少、并发竞争激烈的场景(
SELECT ... FOR UPDATE)。 - 乐观锁:访问时不加锁,更新时通过版本号(Version)或 CAS 检查。适用于读多写少、冲突较少的场景。
5. MVCC (多版本并发控制)
面试核心: InnoDB 如何实现非阻塞读?
MVCC 解决了“读-写”冲突。InnoDB 通过在每行记录后维护两个隐式列(创建时间/删除时间的事务 ID)以及 Undo Log (回滚日志) 链表来实现。
- 快照读 (Snapshot Read):普通的
SELECT,不加锁,读取的是历史版本。 - 当前读 (Current Read):
INSERT/UPDATE/DELETE,读取的是最新版本,需加锁。
6. 存储引擎:MyISAM vs InnoDB
7. Elasticsearch (ES) 搜索深度解析
面试核心: 倒排索引原理。
- 什么是 ES? 基于 Lucene 的分布式全文检索服务器,近实时。
- 核心:倒排索引 (Inverted Index):
- 正排索引:文档 ID -> 单词。
- 倒排索引:单词 -> 文档 ID 列表。通过分词技术将文本拆解,极大提升搜索性能。
- 分布式架构:
- Index (索引):相当于数据库。
- Shard (分片):将数据水平拆分到不同节点。
- Replica (副本):保证高可用。
- 与关系型数据库区别:ES 擅长模糊搜索、聚合分析;MySQL 擅长事务处理、复杂关联查询。
🚀 后续建议:
这一章由于涉及 Redis 和 ES,内容较为跳跃。在 Rspress 站点中,你可以针对 Redis 的缓存雪崩、穿透、击穿 单独写一篇“三兄弟避坑指南”,这在 Python 后端面试中是“重中之重”。
需要我为你补充 Redis 缓存失效的三种经典场景及其解决方案吗?

