文章

MySQL 学习笔记:从索引到事务

沈行知

暂存笔记,持续补充中。目标:把面试高频 + 日常开发常用的 MySQL 知识串成体系。

一、存储引擎

引擎 事务 锁粒度 适用场景
InnoDB 支持 行锁 默认引擎,OLTP 业务首选
MyISAM 不支持 表锁 只读/日志类历史表

InnoDB 是 MySQL 5.5 之后的默认引擎,支持事务、行级锁、外键、崩溃恢复(redo log)。

二、索引

  • B+ 树:所有数据都在叶子节点,非叶子只存键;叶子之间用双向链表连接,范围查询快。
  • 聚簇索引:主键索引的叶子节点直接存整行数据;二级索引叶子存主键值,回表查询。
  • 最左前缀原则:联合索引 (a, b, c) 只有在查询条件按 a → b → c 顺序时才能用上。
  • 覆盖索引:查询列都被索引覆盖时,无需回表。
  • 失效场景:对索引列做函数/运算、前导模糊 LIKE '%x'、隐式类型转换、or 连接非索引列。
-- 联合索引 (name, age),下面的写法才能命中
SELECT * FROM user WHERE name = '沈行知' AND age > 20;

三、事务与锁

  • ACID:原子性、一致性、隔离性、持久性。
  • 隔离级别(从低到高):读未提交 → 读已提交 → 可重复读(MySQL 默认)→ 串行化。
  • 脏读 / 不可重复读 / 幻读 三者的区别是常考点。
  • :行锁(Record / Gap / Next-Key),InnoDB 用 Next-Key Lock 解决幻读。

四、MVCC 与日志

  • MVCC:通过隐藏列(trx_id、roll_pointer)+ undo log + ReadView 实现快照读,读写不阻塞。
  • redo log:物理日志,保证持久性,用于崩溃恢复。
  • undo log:逻辑日志,用于回滚和 MVCC。
  • binlog:Server 层逻辑日志,用于主从复制和基于时间点的恢复。

五、常用优化

  1. EXPLAIN 看执行计划:关注 type(尽量 range/ref,避免 ALL)、keyrows
  2. 慢查询日志定位慢 SQL,再用索引、改写、分页优化(深分页用「延迟关联」)。
  3. 避免 SELECT *,减少回表;大表考虑分区或归档。

本文为暂存笔记,后续会补充真实案例与图示。