一、索引 (重点)

1. 什么是索引?

  • 索引是提高查询速度的数据结构(类似书的目录)。

  • 本质:用空间换时间

2. 索引底层数据结构

  • InnoDB 默认:B+ 树

  • 为什么不用二叉树 / 红黑树?

    • 树太高,磁盘 IO 次数多,慢

  • 为什么不用 B 树?

    • B+ 树叶子节点链表相连,范围查询更快

    • 非叶子节点不存数据,一次加载更多节点

3. 聚簇索引 vs 非聚簇索引

  • 聚簇索引

    • 主键索引

    • 叶子节点存整行数据

  • 非聚簇索引(二级索引)

    • 普通索引、唯一索引

    • 叶子节点存主键值

    • 查数据需要回表

4. 最左匹配原则

  • 联合索引 (a,b,c)

  • 能命中:aa,ba,b,c

  • 不能命中:bcb,c

5. 索引失效场景(必背)

  1. where 子句对索引列运算 / 函数

  2. 隐式类型转换(字符串不加引号)

  3. != / not in / is not null

  4. or 连接非索引列

  5. 联合索引不满足最左匹配

  6. 优化器觉得全表扫描更快(数据量小)

6. 覆盖索引

  • 查询的字段刚好在索引里,不需要回表

  • 例子:select name from user where id=1name 建了索引


二、事务与 ACID

1. ACID

  • 原子性:要么全成功,要么全失败

  • 一致性:执行前后数据合法

  • 隔离性:事务之间互不干扰

  • 持久性:提交后永久生效

2. 事务隔离级别(从低到高)

  1. 读未提交:脏读

  2. 读已提交:不可重复读(Oracle 默认)

  3. 可重复读:幻读(MySQL InnoDB 默认

  4. 串行化:性能最差

3. 并发问题

  • 脏读:读到未提交数据

  • 不可重复读:同一事务两次查询结果不同

  • 幻读:范围查询出现新行

  • InnoDB 在可重复读下通过 MVCC + 间隙锁 解决幻读


三、MVCC(多版本并发控制)

1. 作用

  • 实现非锁定的一致性读

  • 让读写不阻塞

2. 核心组件

  • 隐藏字段:trx_id(事务 ID)、roll_pointer(回滚指针)

  • undo log:历史版本链

  • read view:一致性视图,决定可见版本

3. 工作原理

  • 可重复读:事务开始时生成一个视图

  • 读已提交:每次查询都生成新视图


四、锁机制

1. 锁粒度

  • 表锁:锁全表,开销小,并发低

  • 行锁:锁单行,开销大,并发高(InnoDB)

2. InnoDB 行锁类型

  • 共享锁(S):读锁,共享

  • 排他锁(X):写锁,独占

3. 间隙锁(Gap Lock)

  • 锁住范围,防止插入

  • 解决幻读

4. 死锁

  • 两个事务互相等待对方锁

  • 解决:

    • 统一顺序访问表

    • 避免长事务

    • 设置超时时间


五、SQL 优化(高频实战题)

1. 怎么优化慢 SQL?

  1. 开启慢查询日志

  2. explain 分析执行计划

  3. 建合适索引

  4. 避免索引失效

  5. 大 SQL 拆分,避免 select *

  6. 优化关联查询、子查询

2. explain 关键字段

  • type:最好到 range 以上,refeq_refconst

  • key:实际使用索引

  • rows:扫描行数

  • ExtraUsing filesortUsing temporary 必须优化


六、存储引擎

InnoDB vs MyISAM

  • InnoDB:支持事务、行锁、外键、崩溃恢复(生产默认)

  • MyISAM:不支持事务,表锁,查询快(几乎不用)


七、日志体系

1. redo log

  • 重做日志,保证持久性

  • WAL 机制:先写日志,再写磁盘

2. undo log

  • 回滚日志,保证原子性

  • 实现 MVCC

3. binlog

  • 归档日志,主从复制、数据恢复

  • 与 redo log 区别:

    • redo log 是 InnoDB 独有

    • binlog 是 Server 层


八、主从复制

原理

  1. 主库写 binlog

  2. 从库 IO 线程拉取 binlog

  3. 从库 SQL 线程重放

主从延迟

  • 原因:从库单线程重放、大事务、网络延迟

  • 解决:并行复制、避免大事务、优化主库


九、高频面试题(背诵)

  1. MySQL 索引为什么用 B+ 树?

  2. 什么是回表?怎么避免?

  3. 事务隔离级别与问题

  4. MVCC 原理

  5. InnoDB 锁机制,间隙锁作用

  6. 慢 SQL 优化步骤

  7. redo log 和 binlog 区别

  8. 最左匹配原则

  9. 索引失效场景

  10. 聚簇索引与非聚簇索引


总结

  • 索引 + 事务隔离 + MVCC + 锁 = 70% 分值

  • SQL 优化 + 执行计划 = 必问实战题

  • 日志 + 主从 = 架构题高频