数据库
校招考察频度:★ 高频(核心必背·高频生死线) 复习主线:PostgreSQL 是现代高并发后端、多模型架构与 AI 向量扩展的绝对核心基座。
数据库是后端研发校招面试的核心技术基石。从底层的磁盘 I/O 调度、数据页布局、B-tree 索引推导,到运行时的 MVCC 多版本并发控制、8 级锁冲突防范,再到高可用容灾与 VACUUM 维护治理,构成了考察应届生计算机底层功底与线上实战避坑能力的最重要分水岭。
分类考频地图
| 专题 | 核心页面 | 校招考频星级 | 重点考查要点 |
|---|---|---|---|
| PG vs MySQL 选型对比 | PG vs MySQL 选型对比 | ★ 高频(核心必背) | 堆表 vs 聚簇索引、无间隙锁 vs Next-Key Lock、HOT 零索引写放大、原生 JSONB + GIN、pgvector 单库强一致一体化架构 vs 独立向量库跨库双写痛点、Agent/RAG 选型 3 分钟答题模版 |
| PG 核心与索引底层 | PG 核心与索引底层 | ★ 高频(核心必背) | B-Tree 索引高度与容量推导、堆表无序存储与 CTID 寻址、HOT 堆内元组技术、覆盖索引(INCLUDE)与千万级深分页优化 |
| 事务与隔离级别 | 事务与隔离级别 | ★ 高频(核心必背) | ACID 保证机制、读已提交(RC)vs 可重复读(RR)快照生成差异、PG 无间隙锁特性、RR 级幻读防范与写偏斜(Write Skew)、SSI 串行化快照隔离 |
| MVCC 并发控制 | MVCC 与并发控制 | ★ 高频(生死线) | 堆内元组多版本、xmin/xmax/t_cid 隐藏字段、快照数组(xmin:xmax:xip_list)算法、CLOG 提交日志与 Hint Bits 机制、无 undo log 架构的利弊权衡 |
| PG 锁机制与并发 | PG 锁机制与并发 | ★ 高频(核心必背) | 8 种表级锁冲突矩阵、在线建索引 CONCURRENTLY、行级锁(FOR UPDATE / NO KEY UPDATE)写在元组头的零内存占用秘密、咨询锁(Advisory Locks)、死锁排查 |
| PostgreSQL 架构 | PostgreSQL 架构 | ★ 高频(架构基石) | 多进程体系(Postmaster / 后端连接进程 / 后台核心工作进程)、shared_buffers 25% 内存配置哲学、work_mem 调优、PgBouncer 生产连接池必备实践 |
| 慢 SQL 优化与执行 | 查询优化与执行 | ★ 高频(排障必考) | 代价优化器(Cost Model)、EXPLAIN (ANALYZE, BUFFERS) 执行计划深度解读、三种 JOIN 连接算法(Nested Loop / Hash / Merge)、Bitmap Scan 原理 |
| WAL 与崩溃恢复 | WAL 与崩溃恢复 | ★ 高频(存储底层) | Write-Ahead Logging 机制、LSN 全局递增序列、full_page_writes 防半写撕裂页(Torn Page)、Checkpoint 检查点机制、崩溃自愈重放流程与 PITR 恢复 |
| VACUUM 与膨胀治理 | Vacuum 与维护 | ★ 高频(运维必考) | 死元组(Dead Tuple)与表膨胀(Bloat)成因、普通 VACUUM vs VACUUM FULL vs pg_repack 在线零停机重建、32 位事务 ID 20 亿回卷危机与 Freeze 机制 |
| 索引体系与选型 | 索引体系与选型 | ☆ 中频(大厂分水岭) | 五大原生索引(B-tree / GIN / GiST / BRIN / Hash)选型边界、部分索引与表达式索引、GIN fastupdate 缓冲、pgvector 向量索引(IVFFlat / HNSW) |
| 底层存储模型 | 存储模型 | ☆ 中频(底层机制) | 堆表 8KB 数据页物理布局(PageHeader / ItemId 槽位 / Tuple 数据区)、CTID 指针、TOAST 机制(2KB 阈值、压缩与外部切片存储) |
| 主从复制与高可用 | 复制与高可用 | ☆ 中频(高可用存储) | 物理流复制(同步 vs 异步 synchronous_commit)、复制槽(Replication Slot)、Patroni + etcd 自动化高可用故障转移、pg_rewind 快速回卷防脑裂 |
| 表分区与生态 | 分区与扩展生态 | ☆ 中频(场景拓展) | 原生声明式分区(RANGE / LIST / HASH)、运行时与规划时分区裁剪(Partition Pruning)、PostGIS 空间扩展、pg_stat_statements 慢 SQL 监控神器 |
| 分库分表与扩展 | 分库分表 | ☆ 中频(海量架构) | 垂直拆分 vs 水平拆分、分片键(Sharding Key)选型原则、Citus 分布式 PG 扩展架构、雪花算法(Snowflake)与分布式 ID 方案 |
| 分布式事务 | 分布式事务 | ☆ 中频(事务进阶) | 刚性事务(2PC / 3PC / XA 规范)、柔性最终一致性(TCC、Saga、本地消息表 + 事务性发件箱 Outbox 模式) |
| 现代存储架构选型 | 数据库选型 | ☆ 中频(架构视野) | 以 PostgreSQL 作为多模态关系核心基座,与 Redis 缓存/分布式锁、Elasticsearch 海量日志检索、专有向量库(Milvus)的协同边界 |
校招面试主线与黄金必考题型
- 架构选型与 Agent/RAG 实战(必考亮眼点):
- 你的 Agent / RAG 项目为什么选了 PostgreSQL 而不是更常用的 MySQL?两者的底层机制有何本质差异?
- 为什么说 pgvector 原生检索避免了传统 MySQL + 独立向量库的双写一致性与网络往返难题?
- 在 Agent 交互轨迹、高频会话心跳与 Token 计数场景下,PG 的 JSONB 和 HOT 机制是如何提供底层支撑的?
- 数据结构与索引底层:
- 为什么底层不用 Hash、红黑树或平衡二叉树?B-Tree 索引 3 层能存多少数据?
- 什么是 CTID?为什么 PG 的主键索引和普通二级索引在物理结构上完全平等?
- 什么是 HOT(Heap-Only Tuples)堆内更新?它解决了堆表更新的什么致命痛点?
- MVCC 与并发隔离:
- PostgreSQL 的 MVCC 为什么不需要 undo log?旧版本存放在哪里?
- 元组头部的
xmin和xmax记录什么?Read View 快照是如何判断可见性的? - 为什么读操作会导致数据页变脏(Hint Bits 机制)?
- PG 的可重复读(RR)级别下能防止幻读吗?什么是写偏斜(Write Skew)?
- 锁与高并发排障:
- 生产千万级大表添加索引为什么必须使用
CREATE INDEX CONCURRENTLY? - 锁定 1 亿行会不会发生锁升级或撑爆内存?(行锁写在元组头的秘密)
- 如何利用 PostgreSQL 的咨询锁(Advisory Locks)实现应用级分布式防重?
- 生产千万级大表添加索引为什么必须使用
- 运维与崩溃恢复(工业界实战):
- 为什么系统没有很多数据,表文件却膨胀到了几百 GB?(表膨胀 Bloat 治理)
- 生产为什么坚决禁用
VACUUM FULL,如何用pg_repack在线解决表膨胀? - 什么是“20 亿事务 ID 回卷危机(TXID Wraparound)”?为什么可能导致整个数据库变成只读甚至无法写入?
- 什么是
full_page_writes?为什么在操作系统 4KB 扇区与 PG 8KB 页之间必须开启它防撕裂?