Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

MySQL 基础教程

下面是一份 超完整、系统化、适合长期收藏的《MySQL 详细介绍(核心概念 + 架构原理 + 存储引擎 + 复制 + 日志 + 事务 + 索引 + 优化)》。内容非常全面,适合入门、进阶。

目录:

  1. MySQL 基础概念
  2. MySQL 架构组成
  3. InnoDB 存储引擎详解
  4. MySQL 数据文件布局
  5. 索引(Index)体系
  6. 锁(Locks)体系
  7. 事务(Transaction)与隔离级别
  8. 日志系统(Redo/Undo/Binlog)
  9. Buffer Pool(缓冲池)机制
  10. SQL 执行过程
  11. MySQL 复制(Replication)体系
  12. MySQL 高可用(HA)方案
  13. 常见性能优化方法
  14. 常见故障排查体系

1. MySQL 基础概念

  • RDBMS:关系型数据库管理系统
  • 支持 SQL
  • 事务支持(ACID)
  • 存储引擎可插拔
  • MySQL 8.0 以后统一使用 InnoDB(默认)

关键特性:

  • 安全可靠
  • 高性能
  • 开源
  • 生态完善

2. MySQL 架构组成(Server 层 + 存储引擎层)

Server 层(通用层)

负责所有与存储无关的功能:

  • 连接管理
  • 查询解析(Parser)
  • 查询优化(Optimizer)
  • 查询缓存(已废弃)
  • 权限认证
  • Binlog 写入

存储引擎层(可插拔)

负责数据的实际存储与读取。

常见引擎:

  • InnoDB(默认)
  • MyISAM(已废弃)
  • Memory
  • CSV
  • Archive

InnoDB 是核心,引擎特性:

  • 事务(ACID)
  • 行锁
  • 自适应哈希索引
  • 双写缓冲
  • 崩溃恢复能力强

3. InnoDB 存储引擎详解(重点)

核心组件:

Buffer Pool(缓冲池)

缓存:

  • 数据页
  • 索引页
  • Undo
  • Insert Buffer

默认大小较小,但建议设置为系统内存的 60%-80%。

Redo Log(重做日志)

保障持久性(D),崩溃恢复必需。

Undo Log(回滚日志)

提供:

  • 事务回滚
  • MVCC(多版本控制)

Double Write Buffer(双写缓冲)

防止数据页损坏(partial write)。

Adaptive Hash Index(自适应哈希索引)

InnoDB 自动优化热点数据访问。

Change Buffer

延迟写辅助结构,用于二级索引。

4. MySQL 数据文件布局

目录结构:

/var/lib/mysql/
    ├─ ibdata1 (系统表空间)
    ├─ ib_logfile0/ib_logfile1(redo 日志)
    ├─ *.ibd(每个表的数据 + 索引)
    ├─ binlog.000001(binlog)
    ├─ relay-log(从库)
    └─ *.frm(8.0 之前)

5. 索引体系(Index)

MySQL 使用 B+Tree 索引(最重要)。

索引类型:

主键索引(Clustered Index)

  • 数据与主键同一棵 B+Tree
  • 叶子节点存储整行数据
  • 强烈建议业务表必须有主键

二级索引(Secondary Index)

叶子节点存储主键值,因此存在 回表

覆盖索引

查询只用到索引,不用回表,性能最佳。

联合索引

遵循最左前缀原则。

6. 锁体系(Locks)

InnoDB 的锁非常丰富:

行级锁(Row Locks)

  • 排它锁(X)
  • 共享锁(S)

间隙锁(Gap Lock)

用于防止幻读(RR 隔离级别启用)。

Next-Key Lock

行锁 + 间隙锁 组合。

意向锁(Intention Locks)

  • IS
  • IX

用来与表锁兼容。

表锁(Table Locks)

7. 事务与隔离级别

事务的 ACID:

  • A 原子性(undo log)
  • C 一致性
  • I 隔离性(锁)
  • D 持久性(redo log)

MySQL 支持 4 个隔离级别:

级别 脏读 不可重复读 幻读
Read Uncommitted
Read Committed
Repeatable Read(默认) ⭐(避免部分幻读)
Serializable

InnoDB 默认 RR,使用:

  • MVCC(非锁)
  • 间隙锁(加锁)

同时防止不可重复读。

8. 日志系统(极重要)

Redo Log

  • WAL(Write Ahead Logging)
  • 保证 crash-safe
  • 确保数据最终刷入磁盘

Undo Log

  • MVCC 快照
  • 回滚事务

Binlog(Server 层)

  • 用于复制
  • 用于 PITR(时间点恢复)

MySQL 故障恢复顺序:

  1. 读取 redo log 恢复未刷盘数据
  2. rollback 未完成事务(undo log)
  3. binlog 做主从同步

9. Buffer Pool(InnoDB 缓存)

Buffer Pool 是 MySQL 最重要的内存结构,用于缓存数据页与索引页,提高性能。

架构:

  • Free List(空闲页)
  • Flush List(脏页)
  • LRU List(最近使用)

调优关键参数:

innodb_buffer_pool_size
innodb_buffer_pool_instances
innodb_buffer_pool_chunk_size

10. SQL 执行过程

执行一条查询:

  1. 客户端连接器
  2. SQL Parser(解析器)
  3. Optimizer(优化器)
  4. Executor(执行器)
  5. 存储引擎读取数据
  6. 返回结果

执行一条写入:

  1. 写入 Buffer Pool
  2. 写 redo log(prepare)
  3. 写 binlog
  4. redo commit
  5. 刷盘

11. MySQL 复制(Replication)

MySQL 提供三种复制:

模式 一致性 延迟 说明
异步 最差 可能很大 主库写成功即可返回
半同步 中等 较低 至少一个从库 ack
增强半同步(MySQL 8) 比半同步更强 更低 强制从库落盘后才 ack

复制基于 binlog + relay log

12. MySQL 高可用(HA)方案

从一致性角度排序:

🥇 1. Group Replication(强一致性)-> InnoDB Cluster

  • 多数派提交
  • 强一致性写入

🥈 2. Galera Cluster / PXC(准强一致)

🥉 3. MySQL 主从复制 + Orchestrator

最终一致性

🥉 4. MHA(最终一致性)

13. 性能优化体系(非常实用)

优化方向:

SQL 优化(最重要)

  • 使用合适索引
  • 避免全表扫描
  • 覆盖索引
  • 尽量避免 JOIN 多超过 3 张表

表结构优化

  • 合理选择数据类型
  • CHAR vs VARCHAR
  • 使用合适的主键(自增 / UUIDv7)

索引优化

  • 选择正确字段建立索引
  • 避免索引失效(函数、类型不同等)

参数优化

如:

innodb_buffer_pool_size
innodb_flush_log_at_trx_commit
max_connections
query_cache_size(8.0 已废弃)

硬件优化

  • 内存足够大
  • NVMe SSD

14. 故障排查体系

常用思路:

  1. 慢查询(slow query log)
  2. 表锁、行锁(SHOW ENGINE INNODB STATUS)
  3. 复制延迟(SHOW SLAVE STATUS)
  4. 连接数耗尽(Too many connections)
  5. 磁盘 IO 高
  6. Buffer Pool 不足
  7. 死锁(DEADLOCK)