数据库面试总览:高频 8 题(初/中级必备)
这不是一份“从零讲数据库”的教程,而是专门帮我应对面试用的提纲:
把常问的数据库面试题集中列出来,细节放在后面的专题文章里慢慢啃。
一、数据库高频面试题总表
下面这 8 道题,是初/中级开发几乎绕不开的数据库面试题,可以当作我的必背清单:
MySQL 索引用的是什么数据结构?为什么不用红黑树?
- 关键点:B+ 树、多叉树、磁盘 IO 次数少、范围查询友好
- 延伸:聚集索引 vs 非聚集索引(InnoDB vs MyISAM)
- 👉 详细见:MySQL 索引与 B+ 树原理
哪些情况会导致索引失效?
哪些情况会导致索引失效?
- 关键点:
LIKE '%xxx'、对索引列做函数/运算、类型不一致导致隐式转换、在OR中混入非索引列 - 延伸:覆盖索引、最左前缀原则、联合索引设计
- 👉 详细见:SQL 优化与索引使用姿势
- 关键点:
怎么分析慢查询?你平时会怎么排查?
- 关键点:
EXPLAIN看执行计划,关注type / key / rows / extra - 延伸:慢查询日志、加索引前先看“是不是业务写法有问题”
- 👉 详细见:慢查询场景与排查思路
- 关键点:
MySQL 事务的 ACID 是什么?具体怎么实现的?
- 关键点:原子性(undo log)、持久性(redo log)、隔离性(锁 + MVCC)、一致性(约束 + 业务逻辑)
- 延伸:redo / undo 的区别、崩溃恢复大致流程
- 👉 详细见:MySQL 事务与锁的核心原理
MySQL 有哪几种隔离级别?会带来哪些并发现象?
- 关键点:
- READ UNCOMMITTED:可能脏读
- READ COMMITTED:解决脏读,可能不可重复读
- REPEATABLE READ(InnoDB 默认):解决不可重复读,靠 MVCC 处理大部分幻读
- SERIALIZABLE:串行化,完全隔离,性能最差
- 延伸:快照读 vs 当前读、间隙锁 / Next-Key Lock
- 👉 详细见:MySQL 事务与锁的核心原理
- 关键点:
什么是 SQL 注入?怎么防护?
- 关键点:字符串拼接 SQL 被恶意拼入条件或语句
- 防护:参数化查询、预编译、使用 MyBatis/JPA 等 ORM、对外暴露接口不要直接透传拼接条件
- 👉 可结合项目中登录/查询接口,自行准备 1~2 个简单案例
为什么要用数据库连接池?HikariCP 有什么优势?
- 关键点:数据库连接建立成本高,通过连接池复用连接、限制并发连接数,防止数据库被打挂
- HikariCP 优势:轻量、性能好、配置简单,Spring Boot 默认推荐
- 👉 详细见:数据库连接池与 HikariCP
主键和唯一索引有什么区别?
- 关键点:
- 主键:不允许为 NULL,一张表只能有一个主键(可以是联合主键)
- 唯一索引:允许有一个 NULL,可以有多个唯一索引
- 延伸:自增主键 vs 业务主键(UUID、订单号等)的优缺点
- 👉 可以结合自己项目,想清楚“为什么这样设计主键”
- 关键点:
建议在复习数据库模块前,先把这 8 道题自己写一份“标准回答 + 延伸追问”,形成自己的话术。
说明:我这里不强调“纸上手写 SQL”。更多是面试中常见的形式:给你一个需求,你能不能快速写出/口述出正确 SQL,并解释为什么这么写、可能用到哪些索引。
二、如何使用这个数据库面试模块
第一步:从这 8 题开始
先保证:每一道题你都能用自己的话讲 2~3 分钟,而不是背概念。第二步:对照专题文章补齐细节
遇到没讲顺的地方,就去看对应的文章:- 索引原理与最左前缀 → MySQL 索引底层原理
- 慢查询与执行计划 → 场景实战:慢查询排查、SQL 优化与执行计划
- 事务、隔离级别、锁 → MySQL 事务与锁机制
- 连接池原理 → 数据库连接池调优
第三步:准备 1~2 个与数据库相关的项目案例
比如:- “我们系统里有一个订单表,最开始没建合适的索引,导致某个查询特别慢,后来我是怎么定位和优化的……”
- “因为并发写多了之后出现了死锁,我是怎么查到死锁信息,并通过调整 SQL 顺序/拆分事务解决的……”
面试的时候,只要围绕这 8 道题 + 自己的项目经历展开,大部分初/中级数据库相关的问答都能比较从容地应对。
🔁 小结:
- 这篇是总览 +题单,适合临上战场前快速过一遍。
- 细节、原理、图示和更多延伸问题,放在后面的数据库专题文章里慢慢消化即可。