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

相关推荐
pearlthriving1 分钟前
c++当中的泛型思想以及c++11部分新特性
java·开发语言·c++
qq_3422958223 分钟前
如何为容器内多个列表实现统一滚动条.txt
jvm·数据库·python
梦魇星虹26 分钟前
idea Cannot find declaration to go to
java·ide·intellij-idea
liyuhh98532 分钟前
《接口幂等性设计的三种方案与实践》
面试
小雅痞35 分钟前
[Java][Leetcode hard] 42. 接雨水
java·开发语言·leetcode
xfcoding35 分钟前
关于代码注释的思考
java
虹梦未来1 小时前
【开发心得】在SpringBoot体系中正确使用redisConfig
java·spring boot·spring
skiy1 小时前
Spring Framework 中文官方文档
java·后端·spring
qq_206901391 小时前
CSS如何引入自适应图标_利用svg外链配合css控制颜色
jvm·数据库·python
weixin_408717771 小时前
Go语言怎么编译Linux程序_Go语言编译Linux可执行文件教程【避坑】
jvm·数据库·python