Java面试八股文数据库篇

1. SELECT 语句完整的执行顺序

难度:⭐
顺序:
FROMONJOINWHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT


2. MySQL事务

难度:⭐⭐

  • ACID:原子性、一致性、隔离性、持久性
  • 隔离级别:读未提交、读已提交、可重复读(默认)、串行化
  • 实现 :通过undo log(回滚)、redo log(持久性)、MVCC(多版本并发控制)

3. MyISAM和InnoDB的区别

难度:⭐

特性 MyISAM InnoDB
事务 不支持 支持
锁粒度 表级锁 行级锁
外键 不支持 支持
索引结构 非聚簇索引 聚簇索引
崩溃恢复 较差 较好

4. 悲观锁和乐观锁的怎么实现

难度:⭐⭐

  • 悲观锁 :使用SELECT ... FOR UPDATE锁定数据,认为冲突高
  • 乐观锁 :通过版本号(version字段)或时间戳,更新时检查版本号是否变化

5. 聚簇索引与非聚簇索引区别

难度:⭐⭐

  • 聚簇索引:叶子节点存储整行数据,每表只能一个(通常是主键)
  • 非聚簇索引:叶子节点存储主键值,需回表查询数据

6. 什么情况下mysql会索引失效

难度:⭐

  • 使用!=<>IS NULL(部分情况)
  • 对索引列使用函数或表达式(如WHERE DATE(create_time)=...
  • 隐式类型转换(如varchar字段传入数字)
  • 联合索引未遵循最左前缀原则
  • 全表扫描比索引快(数据量少)

7. B+tree 与 B-tree区别

难度:⭐⭐

  • B-tree:叶子节点和非叶子节点都存储数据
  • B+tree:数据仅存储在叶子节点,非叶子节点只存索引,叶子节点间有链表,更适合范围查询和磁盘I/O

8. 以MySQL为例Linux下如何排查问题

难度:⭐⭐

  • show processlist 查看当前连接与执行状态
  • show variables like '%slow%' 查看慢查询配置
  • mysqldumpslow 分析慢查询日志
  • top / htop 查看CPU/内存
  • dstat / iostat 查看磁盘I/O
  • perf toppt-query-digest 分析性能

9. 如何处理慢查询

难度:⭐⭐

  1. 开启慢查询日志(slow_query_log
  2. mysqldumpslowpt-query-digest分析慢SQL
  3. 使用EXPLAIN查看执行计划
  4. 优化索引、避免全表扫描
  5. 重构SQL、拆分复杂查询

10. 数据库分表操作

难度:⭐

  • 垂直分表:按字段拆分,常用字段与冷字段分离
  • 水平分表:按规则(如取模、范围)将数据分散到多张结构相同的表中
  • 配合中间件(如ShardingSphere)或应用层路由

11. MySQL优化

难度:⭐

  • 合理设计索引
  • 避免SELECT *
  • 控制连接数、调整buffer_pool大小
  • 分库分表
  • 使用读写分离
  • 定期分析表(ANALYZE TABLE

12. SQL语句优化案例

难度:⭐
优化前:

sql 复制代码
SELECT * FROM orders WHERE DATE(create_time) = '2025-01-01';

优化后:

sql 复制代码
SELECT * FROM orders WHERE create_time >= '2025-01-01' AND create_time < '2025-01-02';

原因: 避免在索引列上使用函数,使索引生效。


13. 你们公司有哪些数据库设计规范

难度:⭐

  • 表名、字段名小写+下划线
  • 每张表必须有主键(自增或UUID)
  • 禁止SELECT *
  • 字段设置NOT NULL并提供默认值
  • 使用InnoDB引擎
  • 关键业务表必须加注释

14. 有没有设计过数据表?你是如何设计的

难度:⭐

  1. 明确业务需求与实体关系
  2. 确定表结构、字段类型、长度
  3. 设计主键、索引(联合索引遵循最左前缀)
  4. 考虑扩展性与分表策略
  5. 添加必要约束(唯一、外键)
  6. 评审SQL执行计划,提前优化

15. 常见面试SQL

难度:⭐

  • 查询每个部门薪资最高的员工
  • 查找重复记录
  • 连续登录天数
  • 行转列(CASE WHEN
  • 自连接查询上下级

示例:

sql 复制代码
-- 每个部门薪资最高
SELECT d.name, e.name, e.salary
FROM employee e
JOIN department d ON e.dept_id = d.id
WHERE (e.dept_id, e.salary) IN (
  SELECT dept_id, MAX(salary)
  FROM employee
  GROUP BY dept_id
);

相关推荐
咖啡八杯11 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
kyriewen12 小时前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试
GuWenyue16 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
ricardo197316 小时前
React 渲染优化:memo / useMemo / useCallback 的正确姿势与并发模式实战
前端·面试
常铭16 小时前
【Java基础】01-HashMap的底层原理
后端·面试
用户1285261160219 小时前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk19 小时前
组件 = 模板 + 业务逻辑
java·前端·vue.js
千寻girling20 小时前
一份不可多得的《微服务》教程
后端·面试·github
Nturmoils20 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
星沉远浦20 小时前
用Gemini高效解决Java代码报错难以定位的问题
java