目录(点击跳转)
1. 事务 ACID
1.1 原子性(Atomicity)
- 含义:事务要么全部成功,要么全部失败回滚,不可分割
- 实现:undo log 回滚日志
- 作用:保证异常情况下可以撤销操作,回到执行前状态
- 面试要点:原子性保证的是“操作要么全做,要么全不做”
1.2 一致性(Consistency)
- 含义:事务执行前后,数据完整性约束不被破坏
- 实现:主键、外键、唯一约束、触发器、事务锁
- 作用:保证数据合法、业务逻辑正确
- 面试要点:一致性是最终目标,ACID 都是为了保证一致性
1.3 隔离性(Isolation)
- 含义:多个事务并发执行时,互相不可见、不干扰
- 实现:锁机制 + MVCC
- 作用:解决脏读、不可重复读、幻读
- 面试要点:隔离性越高,并发性能越低,需要平衡
1.4 持久性(Durability)
- 含义:事务一旦提交,数据永久保存,宕机不丢失
- 实现:redo log 重做日志
- 作用:MySQL 重启后可通过 redo log 恢复已提交数据
- 面试要点:先写 redo log,再写磁盘,保证不丢数据
1.5 面试必背总结
- 原子性:undo log
- 持久性:redo log
- 隔离性:锁 + MVCC
- 一致性:最终目的
2. MVCC 多版本并发控制
2.1 什么是 MVCC
- 多版本并发控制,InnoDB 核心机制
- 读写不阻塞、读读不阻塞、写写互斥
- 大幅提升并发性能
2.2 核心依赖
- undo log:保存历史版本数据
- ReadView:事务快照,决定可见哪个版本
2.3 解决了什么问题
- 脏读
- 不可重复读
- 部分解决幻读(InnoDB 可重复读级别下)
2.4 工作原理
- 每条数据隐藏两个字段:
trx_id:生成此版本的事务IDroll_pointer:指向历史版本(undo log)
- 事务启动时生成 ReadView,判断数据是否可见
2.5 面试必背
- MVCC 只在 RC(读已提交)、RR(可重复读) 两个隔离级别生效
- 实现“无锁读”,高并发必备
- 是 MySQL InnoDB 高并发核心
3. 索引失效 10 种场景
3.1 左模糊 %xxx
where name like '%测试'→ 失效- 右模糊可走索引:
like '测试%'
3.2 字段使用函数/运算
where DATE(create_time) = '2025-05-20'where age + 1 = 18- 索引失效,全表扫描
3.3 隐式类型转换
- 字段是 varchar,查询传数字
where phone = 13800138000→ 失效- 必须加引号:
'13800138000'
3.4 联合索引不满足最左前缀
- 索引 (a,b,c)
- 查询 where b=? and c=? → 索引失效
- 必须包含左侧列 a
3.5 OR 含非索引列
- OR 前后必须都有索引,否则整个失效
where a=1 or b=2,b 无索引 → 失效
3.6 != / not in / is not null
- 这些语法几乎一定不走索引
- 优化:用范围、正向条件替代
3.7 数据分布不均
- 数据重复度太高(如性别、状态)
- 优化器认为全表扫描更快,放弃索引
3.8 join 字段类型不一致
- A 表 int,B 表 varchar
- 索引失效,关联极慢
3.9 order by 混乱
- order by 字段与索引顺序不一致
- 出现 filesort,性能差
3.10 统计信息过期
- 表数据变化大,统计信息不准
- 优化器选错索引
- 解决:
analyze table 表名
4. 锁机制
4.1 InnoDB 锁类型
- 表锁:锁全表,并发低
- 行锁:锁单行,并发高(InnoDB 默认)
- 间隙锁:锁范围,防止插入
- 临键锁:行锁+间隙锁,默认隔离级别下的锁
4.2 死锁四大条件(必须同时满足)
- 互斥
- 请求与保持
- 不可剥夺
- 循环等待
- 破坏任意一个即可避免死锁
4.3 死锁排查
- 命令:
show engine innodb status - 查看 LATEST DETECTED DEADLOCK 段落
- 查看锁等待、事务、SQL
4.4 死锁解决策略
- 按固定顺序加锁
- 事务保持短小
- 设置锁等待超时
- 开启死锁检测(默认开启)
- 避免长事务、大事务
5. 慢查询优化
5.1 开启慢查询日志
slow_query_log = 1
long_query_time = 2 # 超过 2 秒记录
log_queries_not_using_indexes = 1
5.2 分析慢查询
- 工具:
mysqldumpslow - 按次数、时间、锁定时间排序
5.3 explain 执行计划(核心)
重点看4列:
- type:最好是 const → ref → range → all
- key:实际使用索引
- rows:扫描行数越少越好
- Extra:不要出现 Using filesort / Using temporary
5.4 优化手段
- 建立合适索引
- 优化 SQL 语句
- 减少联表、子查询
- 优化分页(大分页用延迟关联)
- 大表分库分表
6. MySQL 高频面试扩展知识点
6.1 事务隔离级别
- 读未提交 RU
- 读已提交 RC(互联网常用)
- 可重复读 RR(MySQL 默认)
- 串行化 Serializable
6.2 三大日志
- undo log:保证原子性、MVCC
- redo log:保证持久性
- binlog:数据备份、主从同步
6.3 索引结构
- InnoDB:B+ 树
- 叶子节点存整行数据(聚簇索引)
- 非叶子节点只存键值
6.4 聚簇索引 vs 二级索引
- 聚簇索引:主键索引,整行数据
- 二级索引:叶子节点存主键,需回表
6.5 大分页优化
limit 100000,20极慢- 优化:延迟关联、主键过滤、覆盖索引
6.6 面试必背总结
- 高并发靠 MVCC + 行锁
- 快查询靠 正确索引 + 良好SQL
- 事务安全靠 ACID + 日志机制
评论区