MySQL 知识体系概览
什么是 MySQL?
MySQL 是全球最流行的开源关系型数据库管理系统,由 Oracle 公司维护。它使用 SQL(Structured Query Language) 作为查询语言,以表(Table) 的形式组织数据——每一行是一条记录,每一列是一个字段。
MySQL 是互联网企业的"标配数据库"——阿里、美团、字节、腾讯等大厂的核心业务几乎都跑在 MySQL 上。它的优势是:开源免费、性能优秀、生态成熟、社区庞大。
MySQL 的架构
MySQL 采用分层架构:连接层(处理连接和认证)→ SQL 层(解析、优化、执行 SQL)→ 存储引擎层(实际存取数据)。
InnoDB 是 MySQL 5.5 后的默认存储引擎,也是面试中考查最多的引擎。InnoDB 支持事务、行级锁、外键和 MVCC,而 MyISAM 不支持这些特性但查询速度快(适合读多写少的场景)。
核心知识点
索引——查询性能的"加速器"
索引(Index) 就像一本书的目录——没有索引时,查找一条数据需要全表扫描(一页一页翻);有了索引,可以直接定位到目标页。
InnoDB 的索引底层是 B+ 树——多叉平衡树,所有数据存储在叶子节点,叶子节点之间用链表相连,非常适合范围查询和排序。
| 索引类型 | 说明 |
|---|---|
| 聚簇索引 | 索引和数据存在一起(InnoDB 主键索引),一张表只有一个 |
| 非聚簇索引 | 索引的叶子节点存的是主键值,查数据需要回表 |
| 覆盖索引 | 查询的列都在索引中,不需要回表 |
| 联合索引 | 多列组合索引,遵循最左前缀原则 |
- 对索引列使用函数或运算:
WHERE YEAR(create_time) = 2024 - 隐式类型转换:字段是
varchar但传了int LIKE以通配符开头:LIKE '%abc'- 联合索引不满足最左前缀:索引
(a, b, c)但查询只用了b - 使用
OR且其中某列无索引
事务——数据一致性的"保障"
事务(Transaction) 是一组要么全部成功、要么全部失败的 SQL 操作。事务遵循 ACID 原则:
- A(Atomicity,原子性):事务中的操作不可分割(undo log 回滚)
- C(Consistency,一致性):事务执行前后数据库从一个一致状态到另一个一致状态
- I(Isolation,隔离性):多个事务并发执行互不干扰(MVCC + 锁)
- D(Durability,持久性):事务提交后数据永久保存(redo log 保证)
MySQL 有 4 种隔离级别:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ✅ 可能 | ✅ 可能 | ✅ 可能 |
| READ COMMITTED | ❌ 解决 | ✅ 可能 | ✅ 可能 |
| REPEATABLE READ(默认) | ❌ 解决 | ❌ 解决 | ❌ 大部分解决 |
| SERIALIZABLE | ❌ 解决 | ❌ 解决 | ❌ 解决 |
MVCC——无锁化的并发控制
MVCC(Multi-Version Concurrency Control,多版本并发控制) 是 InnoDB 实现"读不加锁"的核心机制。每行数据有隐藏的版本链(通过 undo log 保存历史版本),读操作通过 Read View 判断应该读取哪个版本,从而实现读写不互相阻塞。
锁机制——并发写的"协调者"
| 锁类型 | 粒度 | 说明 |
|---|---|---|
| 行锁 | 行 | InnoDB 默认,只锁定操作的行 |
| 间隙锁 | 行间间隙 | 防止幻读,锁定索引记录之间的间隙 |
| Next-Key Lock | 行 + 间隙 | 行锁 + 间隙锁的组合,InnoDB 在 RR 级别下默认使用 |
| 表锁 | 整张表 | MyISAM 默认,粒度大但开销小 |
日志系统——数据安全的"三道保险"
| 日志 | 作用 | 引擎 |
|---|---|---|
| redo log | 崩溃恢复(WAL 预写日志),保证持久性 | InnoDB |
| undo log | 事务回滚 + MVCC 版本链 | InnoDB |
| binlog | 数据归档、主从复制 | MySQL Server 层 |
WAL(Write-Ahead Logging):先写日志再写数据页,即使宕机也能通过 redo log 恢复已提交的事务。
SQL 优化——让查询"飞起来"
SQL 优化的核心工具是 EXPLAIN——它展示 MySQL 如何执行一条查询:
EXPLAIN SELECT * FROM user WHERE name = '张三';
关键字段:type(访问类型,const > ref > range > index > ALL)、key(使用的索引)、rows(扫描行数)、Extra(额外信息,如 Using index 表示使用了覆盖索引)。
学习建议
- MySQL 架构 + 存储引擎 → 理解整体结构
- 索引原理 → B+ 树、索引类型、索引失效(面试最高频)
- 事务 + 隔离级别 → ACID、四种隔离级别
- 锁机制 + MVCC → 并发控制的核心
- 日志系统 → redo/undo/binlog
- SQL 优化 → EXPLAIN、慢查询、分库分表