面试题:后端
后端工程师岗位相关的接口设计、服务端基础、并发、存储和稳定性面试准备。
PostgreSQL 的 MVCC 如何让读写并发,为什么需要 VACUUM?
PostgreSQL 的 MVCC 通过保存行版本和事务可见性信息,让普通读取通常不必等待写入;代价是旧版本需要 VACUUM 回收,否则表膨胀会逐步拖慢查询和增加存储压力。
PostgreSQL 的事务快照和隔离级别怎样影响可见性?
PostgreSQL 的隔离级别决定事务何时建立快照、能看到哪些提交以及遇到冲突时如何结束;选择时要同时考虑业务不变量、锁等待和失败重试。
PostgreSQL 长事务为什么危险,怎样定位和治理?
长事务不只是“执行时间长”,即使处于 idle in transaction,也可能保留旧快照、阻止死元组回收、占用连接并放大锁和复制延迟;排查必须从会话状态和事务边界开始。
PostgreSQL autovacuum 不及时或跟不上时应看哪些指标?
autovacuum 是否跟得上,取决于表的更新删除比例、表规模、触发阈值、worker 和 I/O 预算,以及是否有长事务阻止回收;“已启用”不代表维护及时。
PostgreSQL 表膨胀和索引膨胀有什么区别?
表膨胀和索引膨胀都会表现为对象变大、缓存命中下降或 I/O 增多,但它们的证据和修复动作不同;先区分膨胀发生在表、索引还是两者同时发生。
PostgreSQL B-tree、Hash、GIN、GiST 和 BRIN 索引分别适合什么场景?
PostgreSQL 索引类型不是按“哪个更快”选择,而是按操作符、数据分布和物理顺序匹配访问路径。B-tree 是默认起点,GIN/GiST/BRIN 分别解决多值、关系型搜索和大表范围摘要问题。
PostgreSQL 复合索引的列顺序应怎样设计?
PostgreSQL 复合 B-tree 索引的列顺序,应从真实查询的等值条件、范围条件、排序和连接路径推导,而不是机械地把区分度最高的列放在第一位。
PostgreSQL partial index 和 expression index 适合解决什么问题?
partial index 用谓词只索引热点子集,expression index 为稳定表达式建立索引;它们能缩小索引,但前提是查询可以证明谓词成立、表达式语义稳定且维护成本可接受。
PostgreSQL 的 EXPLAIN ANALYZE 应怎样读,哪些指标最容易误判?
EXPLAIN ANALYZE 会真实执行 SQL,并把估算行数、实际行数、节点耗时、循环次数和缓冲区访问展示出来;它适合验证执行路径,但生产分析前必须先控制副作用和数据规模。
PostgreSQL 统计信息不准时会怎样影响查询计划?
PostgreSQL 规划器依赖列基数、分布和部分相关性统计估算成本;统计过旧、采样不足或数据高度倾斜时,可能选择错误的扫描方式或连接算法。