MySQL 必备基础(2025-2026 生产视角最实用版本)
以下内容把绝大多数公司在面试、接手项目、日常维护中最常遇到的 MySQL 核心知识点浓缩成一份“速查 + 理解 + 避坑”清单,适合快速建立完整认知框架。
一、MySQL 架构与存储引擎(必须记住的几张图)
- 最经典的逻辑架构图(三层)
客户端连接层 ←→ 服务层(SQL Interface → Parser → Optimizer → Executor)
↓
存储引擎层(InnoDB / MyISAM / Memory / Archive …)
↓
文件系统 + 日志(redo log、binlog、undo log、doublewrite buffer …)
- 最常被问的存储引擎对比表(2025-2026 真实生产分布)
| 特性 | InnoDB(默认,95%+场景) | MyISAM | Memory | 现在还在用吗? |
|---|---|---|---|---|
| 事务支持 | 支持(ACID) | 不支持 | 不支持 | — |
| 行级锁 | 支持 | 表级锁 | 表级锁 | — |
| 外键 | 支持 | 不支持 | 不支持 | — |
| 崩溃恢复 | 支持(redo log + undo log) | 不支持(容易丢数据) | 重启丢失 | — |
| 全文索引 | 支持(5.6+,5.7+较好,8.0+很强) | 支持(较老版本较好) | 不支持 | 视情况 |
| 聚簇索引 | 是(主键就是聚簇索引) | 否(非聚簇) | 是 | — |
| 压缩表 | 支持(ROW_FORMAT=COMPRESSED) | 支持 | 不支持 | 偶尔 |
| 适合场景 | 绝大多数 OLTP 系统 | 只读历史表、日志表 | 临时表、小表极致速度 | 极少 |
结论一句话:
除非你有非常明确的理由,否则一律用 InnoDB。
二、MySQL 必须记住的 12 个核心概念(按重要性排序)
- InnoDB 聚簇索引 vs 非聚簇索引
主键 = 聚簇索引,叶子节点存整行数据
普通索引(二级索引)叶子节点存主键值 → 回表 - 索引的本质
索引 = 有序数据结构(B+树为主) + 快速查找 - B+树 vs B树(面试最爱问) 项目 B+树(InnoDB主流) B树 叶子节点 只存数据 + 顺序链表 存所有节点数据 非叶子节点 只存键,不存数据 存键 + 数据 范围查询效率 极高(顺序链表) 较差 扇出(fanout) 更高(节点更小) 较低
- InnoDB 三大日志 日志 作用 位置 刷盘策略 崩溃恢复靠它吗? redo log 物理日志,记录“改了什么” ib_logfile0/1 顺序写,持久化靠它 是 undo log 逻辑日志,回滚 + MVCC 回滚段(表空间内) — 辅助 binlog 逻辑日志,用于主从复制 binlog 文件 提交时刷盘(sync_binlog) 否(复制用)
- redo log 与 binlog 的两阶段提交
prepare → write binlog → commit → write redo log commit
保证主从一致性和崩溃恢复的一致性。
- MVCC(多版本并发控制)核心字段
- DB_TRX_ID(创建版本)
- DB_ROLL_PTR(回滚指针)
- DB_ROW_ID(行ID,非必须)
- ReadView(读视图)决定可见版本
- 四种隔离级别 + 三个并发问题 隔离级别 脏读 不可重复读 幻读 MySQL 默认 READ UNCOMMITTED 有 有 有 很少用 READ COMMITTED 无 有 有 Oracle 默认 REPEATABLE READ 无 无 有* MySQL 默认 SERIALIZABLE 无 无 无 性能最差 *MySQL RR 通过间隙锁 + Next-Key Lock 大部分场景解决幻读
- 间隙锁(Gap Lock)、Next-Key Lock、Record Lock
- Record Lock:锁住单行记录
- Gap Lock:锁住索引记录之间的“间隙”
- Next-Key Lock = Record Lock + Gap Lock(RR 默认)
- InnoDB 行格式(Row Format)对比 格式 变长字段长度列表 NULL 位图 记录头信息 列数据 行溢出页指针 压缩 主流程度 Compact 有 有 有 有 有 否 曾经主流 Redundant 无 无 有 有 有 否 很老 Dynamic 有 有 有 有 有(优化) 否 现代推荐 Compressed 有 有 有 有 有(压缩) 是 大表常用 现在建表默认 Dynamic,建议显式写 ROW_FORMAT=DYNAMIC
- change buffer、doublewrite buffer、自适应哈希索引
- change buffer:延迟写二级索引(insert buffer + delete buffer + purge buffer)
- doublewrite buffer:防止部分页写入(系统表空间的连续 128 个页)
- 自适应哈希索引(AHI):InnoDB 自己根据访问模式建立的内存哈希索引(可关闭)
- InnoDB 锁类型速查表 锁类型 加锁方式 场景 是否阻塞其他事务 共享锁(S) SELECT … LOCK IN SHARE MODE 读锁,允许其他读,不允许写 写阻塞 排他锁(X) SELECT … FOR UPDATE / DML 写锁,别人不能读也不能写 全阻塞 意向锁 自动加(IS/IX) 表级意向,快速判断表是否有行锁 不阻塞 记录锁 精准命中索引 where id = 5 — 间隙锁 范围查询非唯一索引 where id > 5 and id < 10 防幻读 Next-Key Lock 范围 + 记录 RR 隔离级别默认 —
- 慢查询日志 & 执行计划必看字段
- type:system > const > eq_ref > ref > range > index > ALL(越靠前越好)
- key:实际使用的索引
- rows:扫描行数(估算)
- Extra:Using index / Using where / Using temporary / Using filesort(后两者要警惕)
三、MySQL 基础最常考的 20 个问题(建议默写答案)
- InnoDB 和 MyISAM 最大的区别是什么?
- 什么是聚簇索引?为什么建议用自增主键?
- 为什么不推荐 UUID 做主键?
- redo log、undo log、binlog 分别是什么?谁负责什么?
- 什么是两阶段提交?为什么需要它?
- MVCC 的 ReadView 什么时候生成?RR 和 RC 区别在哪?
- 什么是幻读?MySQL RR 是怎么解决幻读的?
- Next-Key Lock 具体锁住什么范围?
- change buffer 什么时候合并?什么时候不使用?
- doublewrite buffer 解决了什么问题?
- 什么是回表?怎么尽量避免回表?
- 索引下推(ICP)是什么?什么时候生效?
- 什么是前缀索引?什么时候用?
- 为什么 LIKE ‘abc%’ 可以走索引,而 ‘%abc’ 不行?
- 联合索引的“最左前缀原则”是什么?
- 什么时候索引会失效?
- explain 中 Using filesort 和 Using temporary 分别代表什么?
- InnoDB 怎么实现自增主键不重复?
- MySQL 8.0 相对于 5.7 最重大的几个变化是什么?
- 你线上遇到过最严重的慢查询/死锁是怎么解决的?
这份清单基本覆盖了 90% 的 MySQL 基础面试 + 生产问题。
如果你想针对其中任意一点展开成“超详细版”(比如 MVCC 详细推演、间隙锁范围图解、change buffer 合并时机等),直接告诉我具体序号或关键词即可。