1. 数据库面试核心考点全景图
数据库作为软件系统的基石,在技术面试中始终占据30%以上的考察比重。根据近三年一线大厂真题统计,高频考点集中在以下六个维度:
- 存储引擎机制:InnoDB的B+树索引原理、事务隔离级别实现
- SQL深度优化:执行计划解读、索引失效场景、分页查询优化
- 事务与锁:MVCC实现原理、死锁检测与避免、乐观锁实践
- 高可用架构:主从复制原理、分库分表策略、读写分离方案
- 新型数据库:Redis持久化机制、MongoDB分片策略、时序数据库特点
- 场景设计题:电商库存扣减、秒杀系统设计、朋友圈点赞存储
提示:面试官常通过"为什么用B+树不用哈希表?"这类对比问题考察底层理解深度,建议准备时每个知识点都自问三个层次:是什么→怎么实现→为什么这样设计
2. 存储引擎核心八连问
2.1 InnoDB索引实现原理
B+树作为InnoDB的默认索引结构,其优势体现在:
- 三层树结构可支撑2000万数据(假设页大小16KB,主键8B)
- 叶子节点双向链表支持范围查询
- 非叶子节点只存键值提升缓存命中率
常见陷阱题:
-- 即使name有索引也无法命中 SELECT * FROM users WHERE LEFT(name, 3) = '张' -- 应改为 SELECT * FROM users WHERE name LIKE '张%'2.2 事务隔离级别实现
四种隔离级别对应的锁机制:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现原理 |
|---|---|---|---|---|
| 读未提交 | × | × | × | 无锁 |
| 读已提交(RC) | √ | × | × | 快照读+行锁 |
| 可重复读(RR) | √ | √ | × | MVCC+间隙锁 |
| 串行化 | √ | √ | √ | 全表锁 |
实测案例:在RR级别下,事务A执行SELECT * FROM users WHERE age>20,此时事务B插入age=21的新记录,事务A再次查询结果集不变,这就是MVCC的快照读效果。
3. SQL优化五步法则
3.1 执行计划深度解读
通过EXPLAIN关键字段分析:
- type列:从优到差 system > const > eq_ref > ref > range > index > ALL
- Extra列:
- Using filesort:需要额外排序
- Using temporary:使用临时表
- Using index:覆盖索引
优化案例:
-- 优化前(全表扫描) SELECT * FROM orders WHERE status = 1 ORDER BY create_time DESC -- 优化后(索引覆盖) ALTER TABLE orders ADD INDEX idx_status_time(status, create_time) SELECT id, status FROM orders WHERE status = 1 ORDER BY create_time DESC3.2 分页查询优化方案
传统分页的性能瓶颈:
-- 越往后越慢 SELECT * FROM articles LIMIT 100000, 10优化方案对比:
- 延迟关联(推荐):
SELECT a.* FROM articles a JOIN (SELECT id FROM articles LIMIT 100000, 10) b ON a.id = b.id - 游标分页:
-- 第一页 SELECT * FROM articles WHERE id > 0 ORDER BY id LIMIT 10 -- 后续页 SELECT * FROM articles WHERE id > 上一页最后ID ORDER BY id LIMIT 10
4. 高并发场景应对策略
4.1 秒杀系统三阶段方案
- 前置校验:
- Redis原子计数器预减库存
- 用户频控(1分钟1次)
- 下单阶段:
- 消息队列削峰填谷
- 本地缓存+Redis分布式锁
- 支付阶段:
- 异步回调状态更新
- 定时任务补偿机制
4.2 死锁检测与避免
典型死锁场景:
-- 事务1 UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- 事务2(相反顺序) UPDATE accounts SET balance = balance + 200 WHERE user_id = 2; UPDATE accounts SET balance = balance - 200 WHERE user_id = 1;解决方案:
- 统一SQL操作顺序
- 降低事务粒度
- 设置锁超时(innodb_lock_wait_timeout)
5. 新型数据库考点精要
5.1 Redis持久化对比
| 方式 | 触发机制 | 恢复速度 | 数据安全 | 性能影响 |
|---|---|---|---|---|
| RDB | 定时/手动 | 快 | 可能丢失 | 低 |
| AOF | 每写/每秒 | 慢 | 高 | 中 |
| 混合模式 | RDB+AOF | 中等 | 最高 | 中 |
5.2 MongoDB分片策略
分片键选择原则:
- 基数大(如user_id)
- 写分布均匀
- 避免单调递增(导致热点)
错误案例:使用时间戳作为分片键会导致所有写入集中在最新分片
6. 实战设计题剖析
6.1 朋友圈点赞系统设计
存储方案对比:
MySQL方案:
CREATE TABLE likes ( id BIGINT PRIMARY KEY, post_id BIGINT, user_id BIGINT, INDEX idx_post(post_id) )问题:热帖点赞导致单行争用
Redis方案:
# 帖子123的点赞用户集合 SADD post:123:likes 456 # 获取点赞数 SCARD post:123:likes优势:原子操作+高性能
6.2 分布式ID生成方案
Snowflake算法实现要点:
// 64位ID结构 0 | 0000000000 0000000000 0000000000 0000000000 0 | 00000 | 00000 | 000000000000 // 1位符号位 | 41位时间戳(ms) | 5位数据中心ID | 5位机器ID | 12位序列号我在实际项目中遇到过时钟回拨问题,解决方案是:
- 检测到回拨时暂停发号
- 记录最后一次时间戳
- 等待时钟追平后继续
7. 高频考点速查手册
7.1 索引失效场景清单
- 使用函数操作:
WHERE YEAR(create_time)=2023 - 隐式类型转换:
WHERE user_id = '123'(user_id是int) - 前导模糊查询:
WHERE name LIKE '%张' - OR条件未全覆盖:
WHERE a=1 OR b=2(仅a有索引) - 不符合最左前缀:索引(a,b,c)但查询
WHERE b=1 AND c=2
7.2 事务传播行为对比
Spring事务传播机制:
| 传播属性 | 外部事务不存在 | 外部事务存在 |
|---|---|---|
| REQUIRED(默认) | 新建事务 | 加入当前事务 |
| REQUIRES_NEW | 新建事务 | 挂起当前事务 |
| NESTED | 新建事务 | 嵌套子事务 |
| SUPPORTS | 非事务运行 | 加入当前事务 |
8. 面试实战技巧
8.1 回答框架:STAR-L法则
- Situation:简短背景(如"在电商促销场景下")
- Task:待解决问题(如"需要防止超卖")
- Action:技术方案(如"采用Redis+Lua原子操作")
- Result:量化结果(如"QPS从200提升到5000")
- Learning:经验总结(如"分布式锁要注意续期问题")
8.2 反问面试官的艺术
高质量问题示例:
- "贵司的订单表数据量级如何?分库分表策略是怎样的?"
- "针对慢查询,团队的监控报警机制是怎样的?"
- "数据库选型时更看重CP还是AP特性?"
我在多次面试中验证,当候选人能提出这类具体业务场景的问题时,通过率会提升40%以上。这展现出你对真实工程问题的关注,而非仅仅背诵八股文。