D
AI
学习工作台
后端面试题2026-03-171 分钟阅读

数据库面试指南

索引、事务与数据库优化

数据库索引事务优化记笔记标记疑惑

索引

B+ 树是 MySQL InnoDB 的默认索引结构。非叶子节点仅存键值,叶子节点存完整记录并形成有序链表。树高低、范围查询高效(顺序扫描叶子即可)。

聚簇索引:主键索引的叶子节点直接存行数据,表按主键物理有序。二级索引叶子存主键,回表指通过主键再查聚簇索引取完整行。

覆盖索引:查询列均在索引中,无需回表,性能最佳。最左前缀:联合索引 (a,b,c) 可支持 a、a,b、a,b,c 的查询,不支持 b、c 单独查询。

索引失效:函数、类型隐式转换、前导模糊匹配(like '%x')、OR 一侧无索引等会导致全表扫描。

事务

ACID:原子性(Undo Log)、一致性(业务 + 约束)、隔离性(MVCC + 锁)、持久性(Redo Log)。

隔离级别:读未提交、读已提交(RC)、可重复读(RR)、串行化。MySQL 默认 RR。RC 有不可重复读;RR 通过 MVCC 和间隙锁减少幻读。

MVCC:多版本并发控制,通过 undo log 和 read view 实现快照读,读不加锁,写加锁。提高并发。

死锁:多事务互相等待。预防:固定加锁顺序、短事务;检测:等待图;解决:回滚代价小的事务。

优化

EXPLAIN:看 type(const/ref/range/index/all)、key、rows、Extra(Using index/Using filesort 等)。

SQL 优化:避免 SELECT *、减少子查询、用 JOIN 替代 IN、分页用延迟关联。表设计:合理范式、适度冗余、分区/分表。

读写分离:主写从读,主从延迟需考虑。分库分表:按业务或哈希分片,注意跨分片查询、分布式事务。

知识卡片

问题

B+ 树相比 B 树为什么更适合做数据库索引?

点击翻转查看答案

答案

B+ 树非叶子节点只存键、不存数据,单页可容纳更多键,树高更低;叶子节点形成有序链表,范围查询高效。

问题

什么是幻读?如何解决?

点击翻转查看答案

答案

同一事务内多次查询结果集不一致,因其他事务插入/删除。解决:间隙锁(Gap Lock)或 Serializable 隔离级别。

问题

慢查询优化的一般思路是什么?

点击翻转查看答案

答案

1) EXPLAIN 看执行计划;2) 检查是否走索引、有无回表;3) 考虑索引优化、重写 SQL、分库分表;4) 缓存热点数据。