深入理解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 —— 保证“崩溃恢复”

写入一条记录时:

  1. 修改 Buffer Pool 的数据页(内存)
  2. 写入 Redo Log(顺序 IO)
  3. 事务提交成功
  4. 后台刷盘把脏页写到磁盘(异步)

为什么要有 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?

关键点:

  1. Buffer Pool:缓存热点页,绝大部分读不落盘
  2. Redo Log(WAL):顺序写,写入快
  3. B+Tree 索引:层级低,查找快
  4. 主从 + 读写分离:扩展读能力
  5. 连接池 / 线程池:减少连接开销

🚀 总结一张图(核心知识一图掌握)

Client
  ↓
Server 层
    解析器 → 优化器 → 执行器
    ↘           ↑
     Binlog     |
          ↓
InnoDB 引擎
    Buffer Pool
    Redo Log / Undo Log
    B+Tree 索引
    页组织、事务、锁
posted @ 2025-12-06 13:37  中登程序猿  阅读(0)  评论(0)    收藏  举报