MySQL 是后端、数据方向面试的必考项。很多人会用,但一问原理就卡壳。
这篇文章从面试真实高频问题出发,帮你一次性打通 MySQL 的核心知识点。
InnoDB(默认)
MyISAM(基本淘汰)
Memory
Archive
✅ 支持 事务
✅ 支持 行级锁
✅ 支持 外键
✅ 支持 崩溃恢复(redo log)
📌 面试一句话回答
InnoDB 支持事务和行锁,能保证数据一致性和并发性能,所以成为默认引擎。
特性含义Atomicity原子性,要么全成功要么全失败Consistency事务前后数据状态一致Isolation并发事务互不影响Durability提交后的数据不会丢失
📌 常被追问
👉 MySQL 是靠什么保证这些特性的?
原子性:undo log
持久性:redo log
隔离性:锁 + MVCC
一致性:以上共同保证
Read Uncommitted(读未提交)
Read Committed(读已提交)
Repeatable Read(可重复读,默认)
Serializable(串行化)
问题是否出现脏读RU不可重复读RC幻读RR(InnoDB 基本解决)
📌 重点
MySQL 默认是 RR,但 InnoDB 通过 间隙锁 + MVCC 基本解决了幻读问题。
MVCC(多版本并发控制) 是 InnoDB 提供的一种机制。
每行数据都有多个版本
通过 undo log + Read View 实现快照读
读不加锁,写才加锁
提高并发性能
避免大量读写冲突
📌 面试简答版
MVCC 让读操作不阻塞写操作,通过版本控制提高并发能力。
索引是 排好序的数据结构
InnoDB 默认使用 B+Tree 索引。
B+Tree 适合范围查询
磁盘 IO 次数少
叶子节点有序,支持排序和区间
❌ 常见索引失效场景:
使用 LIKE '%xxx'
索引列参与计算
where age + 1 = 20
隐式类型转换
where phone = 123456
组合索引 不符合最左前缀
使用 OR,且部分条件无索引
📌 面试官很爱追问这个
组合索引:
index(a, b, c)
可以命中:
a
a, b
a, b, c
不能命中:
b
b, c
c
📌 一句话
组合索引必须从最左列开始使用。
COUNT(*):统计行数
COUNT(字段):会忽略 NULL,需要判断
在 InnoDB 中:
COUNT(*) 会走最优执行计划
不会真正取所有字段
📌 结论
推荐使用
COUNT(*)
常见原因:
被驱动表数据量太大
JOIN 字段未加索引
where 条件写在错误位置
返回字段过多
📌 优化方向
小表驱动大表
JOIN 字段建索引
用 EXPLAIN 分析执行计划
字段含义type访问类型(越接近 const 越好)key使用的索引rows预估扫描行数extra是否使用临时表、排序
📌 面试官最喜欢问
type 出现 ALL 基本就是性能问题
死锁原因:
多个事务
锁顺序不一致
互相等待资源
保证访问顺序一致
控制事务粒度
合理拆分事务
📌 InnoDB 会自动检测并回滚一个事务
面试可按 四个层次回答:
SQL 层
避免 select *
合理索引
表结构
合理字段类型
控制字段长度
架构层
读写分离
分库分表
缓存层
Redis
本地缓存
MySQL 面试不怕问细,就怕你只会背。
理解 事务、索引、锁、执行计划,基本可以覆盖 80% 的面试问题。
建议:
每一个知识点,都能结合一次 真实 SQL + EXPLAIN 来理解。