常见存储引擎与锁的分类
在 MySQL 中,不同的存储引擎具有不同的锁机制。以下是几种常见存储引擎及其锁的分类。
1. MyISAM 引擎
- 锁类型:表锁
- MyISAM 使用表级锁(Table Lock),即对整个表加锁。
- 每次查询需要先对表加锁,再进行读写操作,锁的粒度较大。
- 优点:锁管理简单,适用于读多写少的场景。
- 缺点:并发性能差,当写操作频繁时,其他读写操作都会被阻塞。
2. InnoDB 引擎
锁类型:行锁 & 表锁
- InnoDB 支持行级锁(Row Lock),即对记录级别进行加锁,锁的粒度更小。
- InnoDB 还支持表锁,但通常使用行锁来实现更高的并发性。
锁实现:
- 共享锁(S 锁): 允许多个事务对同一行读取。
- 排他锁(X 锁): 一个事务获得排他锁后,其他事务无法对该行进行操作。
- 间隙锁(Gap Lock): 锁住一个范围之间的间隙,防止其他事务在此范围内插入数据。
- 下一键锁(Next-Key Lock): 结合行锁和间隙锁,锁住一行及其前后的间隙,用于防止幻读。
应用场景: 适用于事务性应用,保证更高的并发性和数据一致性。
3. Memory 引擎
- 锁类型:表锁
- Memory 存储引擎使用表锁,即每次查询会锁住整个表。
- Memory 表将数据存储在内存中,访问速度非常快,但一旦数据库重启,数据将丢失。
- 应用场景: 常用于临时表或会话数据的缓存,不适合长时间保存数据的应用场景。
4. NDB Cluster 引擎
- 锁类型:行锁
- NDB Cluster 是一种分布式存储引擎,主要用于 MySQL Cluster 集群。
- NDB Cluster 支持行级锁,锁的粒度较小,可以适应高并发应用。
- 应用场景: 用于分布式系统和高可用场景,适合数据分片和水平扩展。
锁的分类总结
锁类型 | 描述 | 适用引擎 |
---|---|---|
表锁(Table Lock) | 锁住整个表,锁粒度大,适合读多写少的应用 | MyISAM、Memory |
行锁(Row Lock) | 锁住特定行,锁粒度小,适合高并发 | InnoDB、NDB Cluster |
间隙锁(Gap Lock) | 锁住行之间的间隙,防止插入,避免幻读 | InnoDB |
下一键锁(Next-Key Lock) | 行锁与间隙锁结合,避免幻读问题 | InnoDB |