深入理解MySQL基本原理和架构
🚀 一、MySQL 整体架构(从宏观到微观)
MySQL 主要由 Server 层 与 存储引擎层(InnoDB) 组成。
┌──────────────────────────────┐
│ Server 层 │
│ SQL解析、优化器、执行器、缓存 │
└──────────────────────────────┘
↓
┌──────────────────────────────┐
│ 存储引擎层 (InnoDB) │
│ Buffer Pool、Redo、Undo、索引 │
└──────────────────────────────┘
Server 层负责“逻辑”
- 连接管理(线程池)
- SQL 解析器(词法/语法分析)
- 优化器(决定走哪个索引、Join 顺序)
- 执行器(真正执行)
- 缓存(如 Query Cache 已废弃)
InnoDB 引擎负责“存储 + 事务”
- 页(Page)机制(16KB)
- Buffer Pool(内存读写缓存)
- Redo Log(崩溃恢复)
- Undo Log(MVCC/回滚)
- B+Tree 索引
- 事务隔离级别
📌 面试重点:Server 层做执行逻辑,InnoDB 才是存储和事务的核心。
🚀 二、查询执行的完整流程(你必须背下来)
你执行:
SELECT * FROM user WHERE id = 1;
MySQL 内部做了什么?
1. 连接器
认证、权限、线程分配。
2. 查询缓存(已废弃)
MySQL 8 已移除,直接跳过。
3. 解析器
把 SQL 转为 AST(抽象语法树),检查语法、列名是否存在。
4. 优化器
决定:
- 走哪个索引
- 用全表扫描还是索引扫描
- Join 的顺序
- 是否使用覆盖索引
5. 执行器
根据优化器计划,从存储引擎层取数据。
6. 存储引擎
从 Buffer Pool 或磁盘读取数据页,并返回给执行器。
面试必答点:优化器只是制定计划,真正取数据的是存储引擎。
🚀 三、InnoDB 的核心:页、行、索引
1)数据以 Page 为单位(16KB)
为什么要懂?
- 索引建立
- 回表次数
- 全表扫描 cost
- 大字段影响性能
所有记录都存在 Page 中,读取数据要读整个 16KB 页。
2)行格式(Compact/Dynamic)
涉及:
- varchar 行溢出
- off-page 存储
- 大字段影响页分裂
3)索引是 B+Tree
主键索引(聚簇索引)和二级索引(非聚簇索引)。
聚簇索引
- 主键顺序存储
- 叶子节点存真实行数据
二级索引
- 叶子节点存的是主键值
- 因此需要回表
覆盖索引可以避免回表,是优化的重要手段之一。
🚀 四、Redo Log 与 Undo Log(事务的灵魂)
搞不懂这两个,你永远理解不了 MySQL 的写入原理。
⭐ Redo Log —— 保证“崩溃恢复”
写入一条记录时:
- 修改 Buffer Pool 的数据页(内存)
- 写入 Redo Log(顺序 IO)
- 事务提交成功
- 后台刷盘把脏页写到磁盘(异步)
为什么要有 Redo?
因为随机 IO 太慢,所以不直接写磁盘,通过“顺序写 redo log”减少 IO。
核心机制:WAL(Write-Ahead Logging)
⭐ Undo Log —— MVCC 和回滚的基础
Undo 用于:
- 事务回滚
- 快照读(MVCC)可见性判断
每一次更新会写 Undo,记录旧值。
MVCC 依赖:
- undo log
- trx_id
- roll_pointer
- ReadView
你刷 MySQL 面试题看到的“RC、RR 区别”其实就是 ReadView 生成时机不同。
🚀 五、Binlog(主从复制的基础)
Binlog 是 Server 层的日志,用于:
- 主从复制
- 数据恢复(基于时间点恢复)
与 Redo 的关键区别:
| 项 | Redo Log | Binlog |
|---|---|---|
| 层级 | InnoDB 引擎层 | Server 层 |
| 作用 | 崩溃恢复 | 主从复制 / 灾备 |
| 写入方式 | 循环写(固定大小) | 顺序追加(无限扩展) |
| 是否物理日志 | 物理日志 | 逻辑日志(记录 SQL 或行变更) |
一致性依赖 —— 两阶段提交(2PC)
解决:redo 成功写了,但 binlog 写失败导致主从不一致。
🚀 六、事务隔离与锁
你必须理解 RC、RR、Serializable 本质区别:
| 隔离级别 | 读问题 | MySQL 行为 |
|---|---|---|
| Read Uncommitted | 脏读 | 不推荐 |
| Read Committed | 不可重复读 | Oracle 默认 |
| Repeatable Read | 避免不可重复读 | MySQL 默认 + MVCC |
| Serializable | 强一致 | 性能差 |
InnoDB 通过:
- MVCC(快照读)
- 锁(当前读)
来保证隔离性。
🚀 七、为什么 MySQL 能抗住上万 QPS?
关键点:
- Buffer Pool:缓存热点页,绝大部分读不落盘
- Redo Log(WAL):顺序写,写入快
- B+Tree 索引:层级低,查找快
- 主从 + 读写分离:扩展读能力
- 连接池 / 线程池:减少连接开销
🚀 总结一张图(核心知识一图掌握)
Client
↓
Server 层
解析器 → 优化器 → 执行器
↘ ↑
Binlog |
↓
InnoDB 引擎
Buffer Pool
Redo Log / Undo Log
B+Tree 索引
页组织、事务、锁
浙公网安备 33010602011771号