数据库面试问题-MySQL版
数据库常见面试题
数据库面试核心问题清单 (带回答区)
第一层:基础知识与SQL掌握程度
1. SQL 语句
问题: 你能写一个包含多表连接、分组和过滤的复杂查询吗?(例如:查询每个部门去年入职的、平均薪资高于公司平均水平的员工信息)
- 回答:
1
2
3-- 在这里写下你的SQL
SELECT * from User u join departments d on u.user_id = d.user_id where 入职时间 > '2024-01-01'and 入职时间 < '2025-01-01'
and u.salary > (select avg(salary) from User)
- 回答:
问题:
INNER JOIN,LEFT JOIN,RIGHT JOIN的区别是什么?- 回答:
- join是数据库中的多表关联查询,
INNER JOIN代表内连接,LEFT JOIN代表左连接,RIGHT JOIN代表右连接。 INNER JOIN:返回两个表共有的行。LEFT JOIN:返回左表所有行,即使右表没有匹配的行。RIGHT JOIN:返回右表所有行,即使左表没有匹配的行。
问题:
WHERE和HAVING子句的区别是什么?- 回答:
WHERE子句:用于过滤数据,返回满足条件的行。HAVING子句:用于过滤分组后的数据。
问题:
UNION和UNION ALL的区别是什么?- 回答:
UNION:返回多个结果集的并集。UNION ALL:返回多个结果集的并集,但保留重复行。
问题: 什么是窗口函数?请举例说明
ROW_NUMBER()的使用场景。- 回答:
- 用于在不分组的前提下,对记录进行分区、排序和聚合计算。它不会减少结果行数,适用于很多排名、累计、分组内统计等高级查询场景
ROW_NUMBER()多数用于每个分组中选出第1名,例如每个部门查询薪资最高的人
问题: 你如何定位并优化一条慢查询SQL?
EXPLAIN命令你会用吗?
- 回答:
- 通过EXPLAIN命令查看SQL执行计划,通过查看执行计划,可以知道SQL执行过程中哪些步骤使用了索引,哪些步骤没有使用索引,从而判断出哪些SQL执行效率较低。
2. 索引
问题:(必考) 什么是数据库索引?它的主要作用是什么?
- 回答:
问题: 索引为什么能提高查询速度?它的底层数据结构通常是什么?
- 回答:
问题: 为什么数据库索引常用B+树而不是B树、哈希表或红黑树?
- 回答:
问题:(必考) 什么是聚簇索引和非聚簇索引(二级索引)?它们有什么区别?
- 回答:
问题:(高频) 什么是“回表”?在什么情况下会发生?
- 回答:
问题: 如何避免回表操作?(引出覆盖索引)
- 回答:
问题: 什么是覆盖索引?
- 回答:
问题: 设计数据库索引时,你会遵循哪些原则?
- 回答:
问题:(高频) 什么是索引的“最左前缀原则”?请举例说明。
- 回答:
问题: 在哪些情况下,即使创建了索引,查询也不会使用它(索引失效)?
- 回答:
3. 事务
问题:(必考) 什么是数据库事务?
- 回答:
问题:(必考) 请解释一下事务的ACID四大特性。
- 回答:
- A (Atomicity):
- C (Consistency):
- I (Isolation):
- D (Durability):
- 回答:
问题: 并发事务可能会导致哪些问题?(脏读、不可重复读、幻读)
- 回答:
问题: 数据库的四种隔离级别分别是什么?它们各自解决了哪些并发问题?
- 回答:
问题: MySQL InnoDB存储引擎默认的事务隔离级别是什么?
- 回答:
第二层:数据库引擎与锁机制
1. 存储引擎
问题: MySQL的InnoDB和MyISAM存储引擎有什么核心区别?
- 回答:
问题: 在现代应用中,为什么我们通常选择使用InnoDB?
- 回答:
2. 锁机制
问题: 数据库中的锁有哪些分类?(从锁粒度、锁模式等角度回答)
- 回答:
问题: 什么是共享锁(读锁)和排他锁(写锁)?
- 回答:
问题:(高频) 什么是乐观锁和悲观锁?它们各自的实现方式和应用场景是什么?
- 回答:
问题:(高频) 什么是MVCC(多版本并发控制)?它的实现原理是什么?
- 回答:
问题:(进阶) 什么是间隙锁(Gap Lock)和临键锁(Next-Key Lock)?它们解决了什么问题?
- 回答:
问题: 什么是死锁?死锁产生的条件是什么?如何排查和避免死锁?
- 回答:
第三层:性能优化与架构设计
1. 性能优化
问题:(场景题) 如果线上一个接口响应很慢,你怀疑是数据库问题,你的排查思路是怎样的?
- 回答:
问题:
EXPLAIN命令的输出结果中,你最关注哪些字段?(例如type,key,rows,Extra)- 回答:
问题: 当一张表的数据量达到千万甚至上亿级别时,你会考虑哪些优化方案?
- 回答:
问题:
COUNT(*)、COUNT(1)和COUNT(列名)有什么区别?哪个性能更好?- 回答:
2. 数据库架构
问题: 为什么要进行分库分表?
- 回答:
问题: 分库分表有哪些常见方案?(水平切分 vs 垂直切分)
- 回答:
问题: 分库分表后会带来哪些新的挑战?(如分布式事务、跨库查询、全局唯一ID等)
- 回答:
问题: 数据库主从复制的原理是什么?Binlog在其中扮演什么角色?
- 回答:
问题: 你是否遇到过主从延迟的问题?可能的原因是什么?如何解决?
- 回答:
问题: 什么是读写分离?它的实现方案有哪些?
- 回答:
3. 项目实践
问题:(必考) 请分享一个你在项目中做过的数据库优化案例。
- 回答:
- 背景描述: 遇到了什么问题?
- 分析过程: 你是如何定位问题的?
- 解决方案: 你采取了什么措施?为什么?
- 最终效果: 优化结果如何?有量化数据吗?
- 回答:
问题: 你们项目中的数据库备份策略是怎样的?
- 回答: