当前位置:首页 > 问答 > 正文

数据库面试那些绕不开的问题和你得准备的重点题目合集

的核心思想是,面试官问这些问题,不是想听你背书,而是想考察你的思考过程、你是否真的在实战中用过、以及你如何解决实际问题,所以准备时,一定要结合自己的理解和(如果有的话)项目经验。

SQL查询与基础

这是敲门砖,必须熟练到像呼吸一样自然。

  1. 核心查询语句(增删改查): 你得非常熟练地写出SELECT(尤其是带DISTINCT, LIKE, IN的)、INSERTUPDATEDELETE语句,重点在于WHERE条件的灵活运用。
  2. 多表连接(JOIN): 这是必考点,你必须能说清楚并手写INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN的区别,面试官最爱问:“LEFT JOIN和INNER JOIN有什么区别?什么时候该用哪个?” 准备一个实际的业务场景来解释,查询所有用户及其订单信息(包括没有订单的用户)”,这就必须用LEFT JOIN
  3. 聚合函数与分组(GROUP BY + HAVING): 你得知道COUNT, SUM, AVG, MAX, MIN怎么用,关键是要分清WHEREHAVING的区别,简单记:WHERE在分组前过滤行,HAVING在分组后过滤组,常考题:“查询订单数量超过5个的客户id。”
  4. 排序与去重(ORDER BY, DISTINCT): 结合其他语句使用,要知道ORDER BY默认是升序(ASC),降序是DESC。
  5. 案例题: 面试官常会给一两张简单的表结构,让你现场写一个稍复杂的查询,有一张学生表、一张成绩表,让你“查询每门课程的平均分,并按平均分从高到低排序”,这考察的是综合运用JOIN, GROUP BY, AVG, ORDER BY的能力。

数据库核心概念与原理

这部分是看你有没有深入理解,而不仅仅是会用人。

  1. 事务(Transaction)及其特性(ACID): 这个是重中之重,你必须用自己的话解释ACID:
    • 原子性(Atomicity):事务里的操作要么全成功,要么全失败,没有中间状态,比如转账,不能我扣了钱,对方没收到。
    • 一致性(Consistency):事务执行前后,数据库的完整性约束不能被破坏,比如转账前后,两个人的总金额应该不变。
    • 隔离性(Isolation):多个事务同时执行时,互相之间感觉不到对方的存在,这会引出一个更复杂的问题——隔离级别。
    • 持久性(Durability):事务一旦提交,它对数据的改变就是永久性的,即使系统故障也不会丢失。
  2. 隔离级别与并发问题(脏读、不可重复读、幻读): 这是难点,但必须掌握,你要能解释:
    • 脏读:读到了另一个未提交事务的数据。
    • 不可重复读:同一个事务内,两次读同一数据,结果不一样(因为被别的事务修改了)。
    • 幻读:同一个事务内,两次查询同一条件,第二次查出了第一次没有的新行(因为被别的事务插入了)。 你要能说出MySQL的四种隔离级别(读未提交、读已提交、可重复读、串行化),并说明每个级别能解决哪些并发问题,常问:“MySQL默认的隔离级别是什么?(可重复读)为什么选这个?”
  3. 索引(Index): 索引是提高查询速度的关键。
    • 为什么要用索引? 类比书的目录,加快查找速度。
    • 索引的底层数据结构?(B+树) 虽然不要求你手写B+树,但你要知道B+树相比二叉树的优势:矮胖,层级少,适合磁盘IO;叶子节点有指针,适合范围查询。
    • 什么情况下该建索引? 经常用于WHERE条件、JOIN连接、ORDER BY排序的字段。
    • 索引是不是越多越好? 绝对不是!索引会降低增删改的速度(因为要维护索引树),并且占用额外空间,这是一个展示你辩证思考的好机会。
    • 聚簇索引和非聚簇索引的区别? 这是高级一点的问题,简单说,聚簇索引的叶子节点直接存数据行(如表的主键索引),而非聚簇索引的叶子节点存的是主键值,需要回表查询。

实战与优化

这部分考察你解决实际问题的能力。

  1. 慢查询如何排查和优化? 这是一个非常常见的场景题,你可以说:
    • 第一步,开启慢查询日志,找到执行慢的SQL语句。
    • 第二步,使用EXPLAIN命令分析这条SQL的执行计划,这是关键!你要能看懂EXPLAIN结果里几个重要的字段:type(访问类型,ALL是全表扫描,要避免)、key(使用的索引)、rows(预估扫描行数)。
    • 第三步,根据分析结果优化,为查询条件添加索引、优化SQL写法(避免使用SELECT *,避免在WHERE子句中对字段进行函数操作)。
  2. 数据库设计范式? 你需要知道第一范式(1NF,属性不可分割)、第二范式(2NF,消除部分依赖)、第三范式(3NF,消除传递依赖)的基本概念,但更重要的是,你要能说出“反范式设计”——有时候为了查询性能,我们会故意冗余一些字段,牺牲一部分规范性,这再次体现了工程上的权衡。

不同数据库的特定问题

  1. MySQL的存储引擎(尤其是InnoDB和MyISAM的区别): 这是MySQL的特有问题,你必须掌握:
    • InnoDB:支持事务外键行级锁,是MySQL默认且推荐使用的存储引擎,适用于绝大多数需要保证数据一致性的场景。
    • MyISAM不支持事务和外键,只支持表级锁,优点是读性能高,适合只读或者读多写少的场景,但现在基本被InnoDB取代。 面试官常问:“为什么现在MySQL默认用InnoDB而不是MyISAM?” 你就可以从对事务和并发支持更好的角度回答。

总结一下准备重点:

  • SQL是基础:要能熟练手写。
  • 事务和索引是核心:必须深刻理解,能用自己的话讲清楚。
  • 优化思想是关键:展现出你不仅有知识,还有解决实际问题的思路(如用EXPLAIN分析慢查询)。
  • 结合项目:如果可能,准备一两个你如何在项目中设计表、优化SQL的实际例子,这比空谈理论更有说服力。

数据库面试那些绕不开的问题和你得准备的重点题目合集