一、索引 (重点)
1. 什么是索引?
索引是提高查询速度的数据结构(类似书的目录)。
本质:用空间换时间。
2. 索引底层数据结构
InnoDB 默认:B+ 树
为什么不用二叉树 / 红黑树?
树太高,磁盘 IO 次数多,慢
为什么不用 B 树?
B+ 树叶子节点链表相连,范围查询更快
非叶子节点不存数据,一次加载更多节点
3. 聚簇索引 vs 非聚簇索引
聚簇索引
主键索引
叶子节点存整行数据
非聚簇索引(二级索引)
普通索引、唯一索引
叶子节点存主键值
查数据需要回表
4. 最左匹配原则
联合索引
(a,b,c)能命中:
a、a,b、a,b,c不能命中:
b、c、b,c
5. 索引失效场景(必背)
where子句对索引列运算 / 函数隐式类型转换(字符串不加引号)
!=/not in/is not nullor连接非索引列联合索引不满足最左匹配
优化器觉得全表扫描更快(数据量小)
6. 覆盖索引
查询的字段刚好在索引里,不需要回表
例子:
select name from user where id=1,name建了索引
二、事务与 ACID
1. ACID
原子性:要么全成功,要么全失败
一致性:执行前后数据合法
隔离性:事务之间互不干扰
持久性:提交后永久生效
2. 事务隔离级别(从低到高)
读未提交:脏读
读已提交:不可重复读(Oracle 默认)
可重复读:幻读(MySQL InnoDB 默认)
串行化:性能最差
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?
开启慢查询日志
explain分析执行计划建合适索引
避免索引失效
大 SQL 拆分,避免
select *优化关联查询、子查询
2. explain 关键字段
type:最好到
range以上,ref、eq_ref、constkey:实际使用索引
rows:扫描行数
Extra:
Using filesort、Using temporary必须优化
六、存储引擎
InnoDB vs MyISAM
InnoDB:支持事务、行锁、外键、崩溃恢复(生产默认)
MyISAM:不支持事务,表锁,查询快(几乎不用)
七、日志体系
1. redo log
重做日志,保证持久性
WAL 机制:先写日志,再写磁盘
2. undo log
回滚日志,保证原子性
实现 MVCC
3. binlog
归档日志,主从复制、数据恢复
与 redo log 区别:
redo log 是 InnoDB 独有
binlog 是 Server 层
八、主从复制
原理
主库写 binlog
从库 IO 线程拉取 binlog
从库 SQL 线程重放
主从延迟
原因:从库单线程重放、大事务、网络延迟
解决:并行复制、避免大事务、优化主库
九、高频面试题(背诵)
MySQL 索引为什么用 B+ 树?
什么是回表?怎么避免?
事务隔离级别与问题
MVCC 原理
InnoDB 锁机制,间隙锁作用
慢 SQL 优化步骤
redo log 和 binlog 区别
最左匹配原则
索引失效场景
聚簇索引与非聚簇索引
总结
索引 + 事务隔离 + MVCC + 锁 = 70% 分值
SQL 优化 + 执行计划 = 必问实战题
日志 + 主从 = 架构题高频
数据库MySQL-重点知识 AI
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法