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

相关推荐
gb42152873 分钟前
ChromaDB向量数据库的特点
数据库
小高00721 分钟前
🔥🔥🔥TypeScript 7 正式版来了:别只看 10 倍速度,这 4 个迁移坑更值得注意
前端·javascript·面试
鹿角片ljp24 分钟前
Java框架篇:Spring + SpringMVC + SpringBoot + MyBatis深度复习
java·开发语言
IvorySQL37 分钟前
PostgreSQL 日报| GiST 索引扫描可见性缺陷(8 月 3 日)
数据库·人工智能·postgresql·开源
众人皆醒我独醉37 分钟前
KServe:Kubernetes 原生的模型推理平台——把 vLLM/TGI/Triton 变成 Serverless
人工智能·ci/cd·面试
Lyra_Infra39 分钟前
Java 应用启动脚本 JDK 路径适配优化文档
java·shell
xiaoxiangsiyan39 分钟前
LNMP + Redis Sentinel 高可用架构部署手册(续)
运维·网络·数据库·redis·缓存·架构·sentinel
刘婉晴43 分钟前
【Web漏洞】SQL 注入实战技巧
前端·数据库·sql
CodeHackerBhx1 小时前
Spring Boot 4 防重复提交:从接口幂等到 Redis 分布式锁的完整实践
java·数据库·spring boot·redis·分布式
xlxxy_2 小时前
外部系统调用SAP接口遇到的一些报错
开发语言·数据库·sap·abap