跳到主要内容

MySQL 概览

为什么 MySQL 很重要

MySQL 是无数生产系统的骨干。理解 MySQL 内核对于以下方面至关重要:

  • 性能优化:一个未优化的查询可能拖垮整个应用
  • 数据完整性:正确的事务处理防止财务数据不一致
  • 系统可靠性:理解复制机制防止数据丢失
  • 面试成功:数据库内核是后端面试的核心话题

实际影响

  • 缺少索引可能导致查询耗时 10 秒而非 10 毫秒
  • 错误的隔离级别可能导致金融事务中出现幻读
  • 不理解死锁可能导致生产故障

MySQL 概览

核心特性

  • 可插拔存储引擎:在 InnoDB、MyISAM 等之间切换
  • 客户端-服务器架构:网络连接、每连接一个线程
  • SQL 标准兼容:ACID 事务、外键、视图
  • 开源:广泛支持、社区驱动

快速参考

存储引擎

特性InnoDBMyISAM
事务✅ ACID
行级锁表级锁
外键
崩溃恢复
默认引擎始于MySQL 5.55.5 之前

事务隔离级别

级别脏读不可重复读幻读使用场景
Read Uncommitted很少使用
Read Committed (RC)许多数据库的默认值
Repeatable Read (RR)⚠️*MySQL 默认值
Serializable严格一致性

*MySQL InnoDB 通过 Gap Lock 防止幻读

索引类型

类型描述示例
主键索引聚簇索引,数据与索引一起存储PRIMARY KEY (id)
二级索引非聚簇,存储主键值INDEX (email)
唯一索引强制唯一性UNIQUE (username)
组合索引多列索引INDEX (name, age)
全文索引文本搜索FULLTEXT (content)

关键日志

日志层级用途
BinlogServer 层复制、恢复
Redo LogInnoDB 层崩溃恢复(WAL)
Undo LogInnoDB 层回滚、MVCC

文档结构

本 MySQL 文档分为 6 个完整章节:

1. 架构与存储引擎

你将学到

  • MySQL 的三层架构
  • InnoDB 与 MyISAM 对比
  • 查询执行流程
  • 不同存储引擎的适用场景

为什么重要: 选择错误的存储引擎可能导致数据损坏、并发性能差和无法从崩溃中恢复。

2. 索引

你将学到

  • B+ Tree 结构及为什么 MySQL 使用它
  • 聚簇索引与二级索引
  • 最左前缀规则
  • 覆盖索引
  • 索引优化技术

为什么重要: 一个索引可以将查询性能提升 1000 倍。过度索引会拖慢写入。

3. 事务

你将学到

  • ACID 属性及其实际示例
  • 隔离级别及其权衡
  • MVCC(多版本并发控制)
  • Undo log 和 redo log 的作用

为什么重要: 理解隔离级别可以防止金融系统中的幻读。MVCC 实现了无锁高并发。

4.

你将学到

  • 锁粒度(全局锁、表锁、行锁)
  • 锁模式(共享锁 vs 排他锁)
  • Gap Lock 和 Next-Key Lock
  • 死锁检测和预防

为什么重要: 死锁可能导致生产故障。理解锁类型有助于诊断性能问题。

5. 日志与复制

你将学到

  • Binlog、redo log、undo log 的区别
  • WAL(Write-Ahead Logging)
  • 主从复制过程
  • 复制延迟监控

为什么重要: 复制实现读取扩展和灾难恢复。正确的日志配置确保数据持久性。

6. SQL 优化

你将学到

  • EXPLAIN 分析
  • 查询优化技术
  • 深分页优化
  • Schema 设计最佳实践

为什么重要: 优化的查询减少数据库负载、提升响应时间、降低基础设施成本。

面试题清单

用此清单验证你的 MySQL 知识:

架构

  • 解释 MySQL 的三层架构
  • 对比 InnoDB 和 MyISAM
  • 什么情况下会用 MyISAM 而非 InnoDB?
  • 查询缓存是什么,为什么在 MySQL 8.0 中被移除?

索引

  • 为什么 MySQL 使用 B+ Tree 而非 B Tree?
  • 聚簇索引和二级索引有什么区别?
  • 用示例解释最左前缀规则
  • 什么是覆盖索引?
  • 为什么 WHERE YEAR(date) = 2024 不使用索引?
  • 如何优化深分页(LIMIT 1000000, 10)?

事务

  • 用实际示例解释 ACID
  • Undo log 如何保证原子性?
  • Redo log 如何保证持久性?
  • RC 和 RR 隔离级别有什么区别?
  • InnoDB 中的 MVCC 如何工作?

  • 表锁和行锁有什么区别?
  • 解释 S 锁和 X 锁
  • 意向锁有什么用途?
  • 什么是 Gap Lock,何时使用?
  • InnoDB 如何检测死锁?
  • Record Lock、Gap Lock 和 Next-Key Lock 有什么区别?

日志与复制

  • Binlog、redo log 和 undo log 有什么区别?
  • WAL(Write-Ahead Logging)如何工作?
  • 解释 MySQL 主从复制过程
  • 什么是半同步复制?
  • 如何监控复制延迟?

优化

  • 如何分析慢查询?
  • EXPLAIN 中 refeq_ref 有什么区别?
  • 为什么 WHERE LOWER(name) = 'alice' 不使用索引?
  • 什么时候应该反范式化 Schema?
  • 如何优化 COUNT(*) 查询?

常见面试题

Q1:为什么 InnoDB 是默认存储引擎?

答案:InnoDB 提供 ACID 合规性、行级锁(更好的并发性)、通过 redo log 实现的崩溃恢复以及外键支持。MyISAM 缺少事务支持且使用表级锁,不适合高并发的 OLTP 负载。

Q2:聚簇索引和二级索引有什么区别?

答案:聚簇索引在叶节点中存储实际的数据行。在 InnoDB 中,主键就是聚簇索引。二级索引在叶节点中存储主键值,需要二次查找才能获取完整行数据。

Q3:解释 InnoDB 中的 MVCC

答案:MVCC(多版本并发控制)允许多个事务在不加锁的情况下并发访问数据库。InnoDB 使用 undo log 实现 MVCC,undo log 存储行的先前版本。每个事务基于其读视图看到数据快照,防止脏读并实现非阻塞读。

Q4:Binlog 和 redo log 有什么区别?

答案:Binlog 是 Server 层的逻辑日志,记录 SQL 语句或行变更,用于复制和时间点恢复。Redo log 是 InnoDB 特定的物理日志,记录页修改,用于通过 WAL 进行崩溃恢复。Binlog 在事务提交后写入,而 redo log 在事务提交前写入。

Q5:如何优化深分页?

答案:使用延迟关联(仅查主键的子查询)或记住上一页的最后 ID。例如:

-- 慢:扫描 1,000,010 行
SELECT * FROM orders ORDER BY id LIMIT 1000000, 10;

-- 快:子查询仅扫描主键
SELECT o.* FROM orders o
INNER JOIN (SELECT id FROM orders ORDER BY id LIMIT 1000000, 10) tmp
ON o.id = tmp.id;

学习路径

面试准备

  1. 从架构开始 → 理解全局
  2. 索引 → 最常见的面试话题
  3. 事务 → ACID 和隔离级别
  4. 锁 → 死锁场景
  5. 日志与复制 → 高级话题
  6. 优化 → 实际应用

生产实践

  1. 架构 → 选择合适的存储引擎
  2. 索引 → 优化查询
  3. 优化 → EXPLAIN 和调优
  4. 事务 → 选择合适的隔离级别
  5. 锁 → 诊断和预防死锁
  6. 日志与复制 → 确保数据持久性和可用性

下一步

深入每个章节的细节: