MySQL 知识点详解(索引、存储引擎、事务、锁机制、优化)
一、存储引擎
1. InnoDB vs MyISAM
特性 | InnoDB | MyISAM |
---|---|---|
事务支持 | ✅ ACID 事务支持 | ❌ 不支持事务 |
锁机制 | 行级锁(默认)、表级锁、间隙锁 | 表级锁(读锁/写锁) |
外键约束 | ✅ 支持 | ❌ 不支持 |
崩溃恢复 | ✅ Redo/Undo Log 保证数据恢复 | ❌ 需手动修复表 |
全文索引 | ✅(5.6+版本) | ✅ 原生支持 |
适用场景 | 高并发读写、OLTP(如电商、支付) | 读多写少、静态数据(如日志、报表) |
文件结构 | .ibd (数据+索引) | .frm (表结构)、.MYD (数据)、.MYI (索引) |
核心区别:
- 事务与锁粒度:InnoDB 通过行级锁和 MVCC 支持高并发,MyISAM 表锁在写入时阻塞其他操作。
- 数据完整性:InnoDB 支持外键约束和崩溃自动恢复,MyISAM 无此功能。
2. 其他存储引擎
- MEMORY:数据存储在内存中,读写极快但重启丢失,适用于临时表或缓存。
- ARCHIVE:压缩存储历史数据,适合归档场景,不支持索引。
二、事务与隔离级别
1. ACID 特性
- 原子性(Undo Log):事务操作要么全成功,要么全失败。
- 一致性:事务前后数据满足完整性约束(如主键唯一)。
- 隔离性(MVCC + 锁):通过隔离级别控制并发事务的可见性。
- 持久性(Redo Log):事务提交后数据持久化到磁盘。
2. 隔离级别与问题
隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现方式 |
---|---|---|---|---|
读未提交 | ✅ | ✅ | ✅ | 无锁 |
读已提交 (RC) | ❌ | ✅ | ✅ | MVCC + 行锁 |
可重复读 (RR) | ❌ | ❌ | ❌(InnoDB 通过间隙锁解决) | MVCC + 间隙锁 |
串行化 | ❌ | ❌ | ❌ | 表级锁 |
高频问题:
- 幻读:InnoDB 通过 间隙锁(Gap Lock)和 Next-Key Lock 在 RR 级别下解决。
- MVCC:通过事务版本链和 ReadView 实现非锁定读,减少锁冲突。
三、锁机制
1. 锁类型
分类维度 | 类型 | 说明 |
---|---|---|
操作粒度 | 表锁 | 锁定整张表(MyISAM 默认),并发度低。 |
行锁 | 锁定单行数据(InnoDB 默认),并发度高,但可能死锁。 | |
锁模式 | 共享锁(S锁) | 允许其他事务读,阻止写操作(SELECT ... LOCK IN SHARE MODE )。 |
排他锁(X锁) | 阻止其他事务读写(SELECT ... FOR UPDATE )。 | |
锁范围 | 间隙锁 | 锁定索引记录的间隙,防止插入(解决幻读)。 |
意向锁 | 表级锁,用于快速判断表中是否存在行锁(IS/IX 锁)。 |
2. 锁优化建议
- InnoDB:
- 通过索引减少锁范围,避免全表扫描。
- 控制事务大小,减少锁持有时间。
- MyISAM:
- 设置
low_priority_updates=1
提升读优先级。 - 启用并发插入(
concurrent_insert=1
)减少写阻塞。
- 设置
四、数据库优化
1. SQL 优化
- 索引优化:
- 避免
SELECT *
,使用覆盖索引减少回表。 - 联合索引遵循最左前缀原则。
- 避免
- 查询优化:
- 避免
LIKE '%前缀'
,改用全文索引或倒排索引。 - 拆分复杂查询,减少临时表使用。
- 避免
2. 架构优化
- 读写分离:主库处理写操作,从库处理读操作。
- 分库分表:按业务或数据量分片(如水平分表)。
- 缓存策略:使用 Redis 缓存热点数据,减少数据库压力。
3. 设计优化
- 字段类型:优先使用整型、ENUM 替代字符串,减少存储空间。
- 避免 NULL:NULL 增加查询复杂度,尽量设置默认值。
五、高频面试题
-
InnoDB 如何解决幻读?
- RR 隔离级别下,通过 间隙锁 锁定索引范围,阻止其他事务插入新数据。
-
什么是 MVCC?
- 多版本并发控制,通过事务版本链和 ReadView 实现非锁定读,减少锁冲突。
-
如何避免死锁?
- 按固定顺序访问资源,减少事务粒度,设置合理的超时时间。
-
索引失效的常见场景?
- 对索引列使用函数或运算,OR 连接非索引列,隐式类型转换。
六、扩展知识
- 日志系统:
- Binlog:用于主从复制和数据恢复(逻辑日志)。
- Redo Log:保证事务持久性(物理日志)。
- Undo Log:保证事务原子性(逻辑日志)。
- 高并发设计:
- 限流降级、消息队列异步处理、分布式锁。
总结:MySQL 面试需重点掌握存储引擎、事务隔离、锁机制及优化策略。建议结合实践场景理解理论,并通过 EXPLAIN
分析 SQL 执行计划深化理解。