文章
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 层逻辑日志,用于主从复制和基于时间点的恢复。
五、常用优化
EXPLAIN看执行计划:关注type(尽量 range/ref,避免 ALL)、key、rows。- 慢查询日志定位慢 SQL,再用索引、改写、分页优化(深分页用「延迟关联」)。
- 避免
SELECT *,减少回表;大表考虑分区或归档。
本文为暂存笔记,后续会补充真实案例与图示。