本文整理了 MySQL 最核心的八股文内容,涵盖范式、SQL 执行流程、存储引擎、索引、事务等各大模块,适合用于面试前复习与系统性学习。
1. 数据库三大范式
- 第一范式(1NF):每一列必须是不可再分的原子项。
- 第二范式(2NF):在 1NF 基础上,所有非主属性完全依赖于主键,而不是主键的一部分。
- 第三范式(3NF):在 2NF 基础上,非主属性不依赖于其他非主属性。
2. 一条 SQL 的执行过程
- 连接器:建立连接、身份验证
- 查询缓存(MySQL 8.0 后废除)
- 解析器:生成语法树
- 优化器:选择最优执行计划
- 执行器:与存储引擎交互获取数据
3. 存储引擎对比
引擎 | 特性描述 |
---|---|
MyISAM | 不支持事务、外键,读性能好 |
Memory | 数据存储在内存中,性能高 |
InnoDB | 默认引擎,支持事务、行锁、崩溃恢复 |
4. 索引分类方式
- 按数据结构:B+ Tree、Hash、Full-Text
- 按物理存储:聚簇索引、非聚簇索引
- 按字段特性:主键、唯一、普通、前缀索引
- 按字段数量:单列、联合索引
5. 聚簇索引 vs 非聚簇索引
维度 | 聚簇索引 | 非聚簇索引 |
---|---|---|
存储结构 | 叶子节点存储完整数据 | 叶子节点存储主键值指针 |
查询性能 | 查询快,避免回表 | 覆盖索引快,非覆盖需回表 |
唯一性 | 每表仅一个 | 可有多个 |
适用场景 | 范围/排序查询 | 精确查找 |
6. 如何选择主键
- 字段唯一,不能为空
- 建议使用递增 ID,避免页分裂
- 避免使用业务字段
- 分布式系统建议用雪花 ID
7. 索引实现原理
- InnoDB 使用 B+Tree 结构
- 非叶子节点存索引,叶子节点存数据
- 叶子节点通过双向链表连接
- 查询效率高,I/O 次数少(3~4次)
8. B+Tree 的特点
- 所有数据在叶子节点
- 非叶子节点只存键值
- 叶子节点双向链表连接,适合范围查询
- 高度小,查询快
9. B+Tree、BTree、Hash 对比
项目 | B+ Tree | B Tree | Hash |
---|---|---|---|
范围查询 | 支持 | 不便 | 不支持 |
查询稳定性 | 稳定 | 不稳定 | 高效(仅等值) |
适用场景 | 大量数据 | 中等复杂度查询 | 精确查找(非范围) |
10. 索引失效的常见场景
- 使用
%xx
或%xx%
模糊查询 - 索引字段上使用函数或表达式
- 字符串字段与数字比较(类型转换)
- 联合索引不满足最左前缀法则
- WHERE 子句含 OR 且部分字段无索引
11. 索引优缺点
优点: 提高查询速度
缺点:
- 占用空间
- 增删改性能降低
- 索引维护成本高
12. 索引优化建议
- 使用前缀索引减小索引项
- 利用覆盖索引避免回表
- 自增主键插入效率高
- 联合索引遵循最左匹配原则
- 避免函数、类型转换、模糊查询等导致索引失效
13. 事务四大特性 ACID
特性 | 含义 | 实现方式 |
---|---|---|
原子性 | 要么全做,要么全不做 | undo log |
一致性 | 满足数据完整性约束 | ACID 整体保障 |
隔离性 | 并发事务互不干扰 | MVCC / 锁机制 |
持久性 | 提交的数据永久保存 | redo log |
14. 并发问题与事务隔离级别
问题类型 | 解释 | 出现级别 |
---|---|---|
脏读 | 读到未提交事务的数据 | 读未提交 |
不可重复读 | 同一事务两次查询结果不同 | 读未提交、读已提交 |
幻读 | 查询结果数量不一致 | 可重复读以下级别 |
事务隔离级别:
- Read Uncommitted
- Read Committed
- Repeatable Read(MySQL 默认)
- Serializable
15. MVCC 实现原理
- 多版本控制,读取旧版本数据
- 使用版本链结构控制可见性
- 非阻塞读,适合高并发
16. 锁的分类
- 全局锁:如
flush tables with read lock
- 表级锁:表锁、元数据锁、意向锁
- 行级锁:记录锁、间隙锁、临键锁(Next-Key Lock)
17. 表锁 vs 行锁
特性 | 表锁 | 行锁 |
---|---|---|
粒度 | 粗,锁住整个表 | 精确,锁住具体记录 |
并发性 | 差 | 高 |
应用场景 | 批量操作、表结构修改 | 单行读写操作 |
18. MySQL 日志类型
- redo log:物理日志,持久性保障
- undo log:回滚用,原子性保障
- binlog:逻辑日志,备份与主从复制
- relay log:从库同步日志
- 慢查询日志:记录慢 SQL
19. Redo Log 的作用
- 采用 WAL 机制:先记录日志,再写磁盘
- 顺序写入优化性能
- 宕机后可用于恢复已提交数据
20. 提升查询性能的方法
- 优化 SQL 语句写法
- 合理使用索引
- 避免索引失效
- 使用 EXPLAIN 分析执行计划
- 数据分页优化(如延迟加载)
- 表结构合理设计
- 利用缓存(如 Redis)降低数据库压力
欢迎点赞 + 收藏 + 评论交流!
如果你觉得这篇总结有帮助,别忘了关注我获取更多干货内容~