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
);

相关推荐
zhglhy20 小时前
Java分库分表技术对比分析
java·分库分表
wuyikeer20 小时前
Spring Framework 中文官方文档
java·后端·spring
豆豆的java之旅21 小时前
软考中级软件设计师 数据结构详细知识点(含真题+练习题,可直接复习)
java·开发语言·数据结构
万邦科技Lafite21 小时前
利用淘宝商品详情接口获取商品价格,监控商品价格浮动
数据库·api·开放api接口·淘宝开放接口
无心水21 小时前
Java时间处理封神篇:java.time全解析
java·开发语言·python·架构·localdate·java.time·java时间处理
wuyikeer21 小时前
Spring BOOT 启动参数
java·spring boot·后端
多看书少吃饭21 小时前
Vue + Java + Python 打造企业级 AI 知识库与任务分发系统(RAG架构全解析)
java·vue.js·笔记
深藏功yu名1 天前
Day24:向量数据库 Chroma_FAISS 入门
数据库·人工智能·python·ai·agent·faiss·chroma
studyForMokey1 天前
【Android面试】Activity生命周期专题
android·面试·职场和发展
知识分享小能手1 天前
MongoDB入门学习教程,从入门到精通,MongoDB创建、更新和删除文档(3)
数据库·学习·mongodb