MySQL必备基础

MySQL 必备基础(2025-2026 生产视角最实用版本)

以下内容把绝大多数公司在面试、接手项目、日常维护中最常遇到的 MySQL 核心知识点浓缩成一份“速查 + 理解 + 避坑”清单,适合快速建立完整认知框架。

一、MySQL 架构与存储引擎(必须记住的几张图)

  1. 最经典的逻辑架构图(三层)
客户端连接层  ←→  服务层(SQL Interface → Parser → Optimizer → Executor)
                             ↓
                   存储引擎层(InnoDB / MyISAM / Memory / Archive …)
                             ↓
                   文件系统 + 日志(redo log、binlog、undo log、doublewrite buffer …)
  1. 最常被问的存储引擎对比表(2025-2026 真实生产分布)
特性InnoDB(默认,95%+场景)MyISAMMemory现在还在用吗?
事务支持支持(ACID)不支持不支持
行级锁支持表级锁表级锁
外键支持不支持不支持
崩溃恢复支持(redo log + undo log)不支持(容易丢数据)重启丢失
全文索引支持(5.6+,5.7+较好,8.0+很强)支持(较老版本较好)不支持视情况
聚簇索引是(主键就是聚簇索引)否(非聚簇)
压缩表支持(ROW_FORMAT=COMPRESSED)支持不支持偶尔
适合场景绝大多数 OLTP 系统只读历史表、日志表临时表、小表极致速度极少

结论一句话
除非你有非常明确的理由,否则一律用 InnoDB

二、MySQL 必须记住的 12 个核心概念(按重要性排序)

  1. InnoDB 聚簇索引 vs 非聚簇索引
    主键 = 聚簇索引,叶子节点存整行数据
    普通索引(二级索引)叶子节点存主键值 → 回表
  2. 索引的本质
    索引 = 有序数据结构(B+树为主) + 快速查找
  3. B+树 vs B树(面试最爱问) 项目 B+树(InnoDB主流) B树 叶子节点 只存数据 + 顺序链表 存所有节点数据 非叶子节点 只存键,不存数据 存键 + 数据 范围查询效率 极高(顺序链表) 较差 扇出(fanout) 更高(节点更小) 较低
  4. InnoDB 三大日志 日志 作用 位置 刷盘策略 崩溃恢复靠它吗? redo log 物理日志,记录“改了什么” ib_logfile0/1 顺序写,持久化靠它 是 undo log 逻辑日志,回滚 + MVCC 回滚段(表空间内) — 辅助 binlog 逻辑日志,用于主从复制 binlog 文件 提交时刷盘(sync_binlog) 否(复制用)
  5. redo log 与 binlog 的两阶段提交
   prepare → write binlog → commit → write redo log commit

保证主从一致性和崩溃恢复的一致性。

  1. MVCC(多版本并发控制)核心字段
  • DB_TRX_ID(创建版本)
  • DB_ROLL_PTR(回滚指针)
  • DB_ROW_ID(行ID,非必须)
  • ReadView(读视图)决定可见版本
  1. 四种隔离级别 + 三个并发问题 隔离级别 脏读 不可重复读 幻读 MySQL 默认 READ UNCOMMITTED 有 有 有 很少用 READ COMMITTED 无 有 有 Oracle 默认 REPEATABLE READ 无 无 有* MySQL 默认 SERIALIZABLE 无 无 无 性能最差 *MySQL RR 通过间隙锁 + Next-Key Lock 大部分场景解决幻读
  2. 间隙锁(Gap Lock)、Next-Key Lock、Record Lock
  • Record Lock:锁住单行记录
  • Gap Lock:锁住索引记录之间的“间隙”
  • Next-Key Lock = Record Lock + Gap Lock(RR 默认)
  1. InnoDB 行格式(Row Format)对比 格式 变长字段长度列表 NULL 位图 记录头信息 列数据 行溢出页指针 压缩 主流程度 Compact 有 有 有 有 有 否 曾经主流 Redundant 无 无 有 有 有 否 很老 Dynamic 有 有 有 有 有(优化) 否 现代推荐 Compressed 有 有 有 有 有(压缩) 是 大表常用 现在建表默认 Dynamic,建议显式写 ROW_FORMAT=DYNAMIC
  2. change buffer、doublewrite buffer、自适应哈希索引
    • change buffer:延迟写二级索引(insert buffer + delete buffer + purge buffer)
    • doublewrite buffer:防止部分页写入(系统表空间的连续 128 个页)
    • 自适应哈希索引(AHI):InnoDB 自己根据访问模式建立的内存哈希索引(可关闭)
  3. 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 隔离级别默认 —
  4. 慢查询日志 & 执行计划必看字段
    • type:system > const > eq_ref > ref > range > index > ALL(越靠前越好)
    • key:实际使用的索引
    • rows:扫描行数(估算)
    • Extra:Using index / Using where / Using temporary / Using filesort(后两者要警惕)

三、MySQL 基础最常考的 20 个问题(建议默写答案)

  1. InnoDB 和 MyISAM 最大的区别是什么?
  2. 什么是聚簇索引?为什么建议用自增主键?
  3. 为什么不推荐 UUID 做主键?
  4. redo log、undo log、binlog 分别是什么?谁负责什么?
  5. 什么是两阶段提交?为什么需要它?
  6. MVCC 的 ReadView 什么时候生成?RR 和 RC 区别在哪?
  7. 什么是幻读?MySQL RR 是怎么解决幻读的?
  8. Next-Key Lock 具体锁住什么范围?
  9. change buffer 什么时候合并?什么时候不使用?
  10. doublewrite buffer 解决了什么问题?
  11. 什么是回表?怎么尽量避免回表?
  12. 索引下推(ICP)是什么?什么时候生效?
  13. 什么是前缀索引?什么时候用?
  14. 为什么 LIKE ‘abc%’ 可以走索引,而 ‘%abc’ 不行?
  15. 联合索引的“最左前缀原则”是什么?
  16. 什么时候索引会失效?
  17. explain 中 Using filesort 和 Using temporary 分别代表什么?
  18. InnoDB 怎么实现自增主键不重复?
  19. MySQL 8.0 相对于 5.7 最重大的几个变化是什么?
  20. 你线上遇到过最严重的慢查询/死锁是怎么解决的?

这份清单基本覆盖了 90% 的 MySQL 基础面试 + 生产问题。

如果你想针对其中任意一点展开成“超详细版”(比如 MVCC 详细推演、间隙锁范围图解、change buffer 合并时机等),直接告诉我具体序号或关键词即可。

文章已创建 4206

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部