跳到内容
文章列表

SQL与数据库面试全指南:从索引优化到分库分表

OfferGo 快来面 团队

AI面试专家

6 分钟

SQL与数据库面试全指南:从索引优化到分库分表

数据库是几乎所有技术岗位面试的必考项,尤其是后端岗位。数据库面试考察的范围很广:从SQL语法、索引原理到事务隔离、锁机制、分库分表。很多候选人能写SQL,但被问到"为什么用B+树做索引""MVCC的原理是什么"时就答不上来了。本文梳理数据库面试的完整考点,帮你建立清晰的知识地图。

数据库面试考察的五个层次

第一层是SQL基础:增删改查、多表连接、子查询、聚合函数。第二层是索引原理:数据结构、使用规则、优化。第三层是事务与并发:ACID、隔离级别、锁、MVCC。第四层是架构与优化:慢查询、分库分表、读写分离、高可用。第五层是场景设计:海量数据下的方案设计。中高级岗位尤其看重后三层。

SQL基础:数据库面试的入场券

常用SQL

必考:SELECT的基本用法(WHERE、GROUP BY、HAVING、ORDER BY、LIMIT)?JOIN的几种类型(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)的区别?子查询和关联子查询?聚合函数(COUNT、SUM、AVG、MAX、MIN)?窗口函数(ROW_NUMBER、RANK、DENSE_RANK、LAG、LEAD)?

经典SQL面试题

面试官常给场景题:找出每个部门工资最高的员工?找出连续出现3次的数字?计算累计求和(用窗口函数)?找出重复的邮箱?去重的几种方式(DISTINCT、GROUP BY、窗口函数)?这些经典题要能现场写出来。

索引原理:数据库面试的灵魂考点

索引的数据结构

必考问题:为什么用B+树做索引(高度低、范围查询友好、数据都在叶子节点)?B+树和B树的区别?哈希索引和B+树索引的区别(哈希不支持范围查询)?聚簇索引和非聚簇索引的区别(InnoDB的主键索引是聚簇索引,二级索引的叶子节点存主键值)?覆盖索引(查询的字段都在索引中,无需回表)?最左前缀原则(联合索引的匹配规则)?

索引的使用

什么情况下索引会失效(隐式类型转换、前导模糊查询、函数计算、OR连接、违反最左前缀)?如何选择合适的索引列(区分度高、查询频繁、更新不频繁)?索引的代价(空间、写入性能下降)?如何用EXPLAIN分析SQL(type、key、rows、extra字段的含义)?

慢查询优化

如何定位慢查询(slow query log)?SQL优化的通用思路(先看执行计划、再考虑索引、避免隐式转换、拆分大查询)?如何优化深分页(limit 100000, 10的问题,用游标或延迟关联)?如何优化JOIN(小表驱动大表、索引优化)?

事务与并发:数据库面试的核心深度题

事务的ACID

事务的四大特性(原子性、一致性、隔离性、持久性)?如何实现(undo log、redo log)?事务的隔离级别(读未提交、读已提交、可重复读、串行化)?各隔离级别解决的问题(脏读、不可重复读、幻读)?MySQL默认的隔离级别(可重复读)?

锁机制

MySQL的锁体系:表锁和行锁的区别?共享锁(S)和排他锁(X)?记录锁、间隙锁、临键锁?死锁的产生和解决(检测、超时、回滚)?乐观锁和悲观锁?如何用乐观锁实现并发控制(版本号、CAS)?如何避免死锁(固定顺序、减少锁范围)?

MVCC

MVCC(多版本并发控制)是高级面试的必考深度题。要讲清楚:MVCC解决了什么问题(读写不阻塞)?undo log版本链?ReadView(一致性视图)?快照读和当前读的区别?MVCC如何实现可重复读(事务开始时的快照)?可重复读下如何避免幻读(MVCC+间隙锁)?

架构与优化:数据库面试的进阶核心

主从复制与读写分离

MySQL主从复制的原理(binlog日志)?复制方式(异步复制、半同步复制、组复制)?主从延迟的解决(并行复制、避免大事务、读写分离策略)?如何做读写分离(中间件、应用层路由)?主从一致性问题?

分库分表

什么情况下需要分库分表(单表数据量过大、性能瓶颈)?垂直分库和水平分表的区别?分表字段如何选择(均匀分布、查询条件友好)?分表后的查询问题(跨表查询、聚合、排序)?分库分表中间件(ShardingSphere、MyCat)?分库分表后如何做分布式ID(雪花算法、号段模式)?

高可用

数据库高可用的方案:主从切换(MHA、MGR)?Keepalived虚拟IP?多活架构(同城双活、两地三中心)?如何做容灾备份(全量备份+增量备份)?备份的恢复演练?

不同数据库的对比

MySQL和PostgreSQL的区别?MySQL和Oracle的区别?NoSQL和关系型数据库的对比?Redis、MongoDB、Elasticsearch各自适用什么场景?什么时候用关系型、什么时候用NoSQL?这些对比题在面试中也很常见。

场景设计题

高级数据库面试会有场景题:比如"设计一个订单表并优化查询""系统出现慢查询怎么排查""如何设计一个高并发下的扣库存方案"。答题框架:先明确数据量和并发量级,再设计表结构和索引,然后考虑缓存和读写分离,最后补充分库分表和容灾方案。扣库存这类题要重点讲清楚"如何避免超卖"(乐观锁、Redis预扣减、数据库事务)。

准备建议与常见失分点

准备时按"SQL基础 → 索引 → 事务 → 架构优化 → 场景设计"的顺序复习,重点吃透索引原理、MVCC、锁机制。SQL要能现场写,原理要能讲清楚,场景题要有思路框架。用OfferGo这类AI面试辅助工具模拟问答,把深挖题练到能流畅表达。

常见失分点:SQL能写但说不出执行计划含义;索引原理停留在"B+树"三个字;MVCC和锁机制混淆;事务隔离级别的区别说不清;分库分表只听过名词不理解适用场景。

总结

数据库面试的核心是"索引原理+事务并发+架构优化"。B+树、MVCC、隔离级别、锁机制是必考深度题,慢查询优化和分库分表是进阶考点,场景设计题是中高级的区分项。掌握这些,配合真实的优化案例,你就能在数据库面试中展现出扎实的功底。