事务

ACID

  • Atomicity
  • Consistency
  • Isolation
  • Durability

并发事务问题

  • 脏读 一个事务读到另外一个事务还没有提交的数据

  • 不可重复读 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复度,也就是一个事务第一次和第二次读的中间这个数据被另一个事务提交修改了,所以不一致

  • 幻读 查询的时候没有,插入的时候出现了,跟不可重复读差不多,不过是从0到1。

MySQL 事务隔离级别

隔离级别 脏读 不可重复读 幻读 描述
读未提交 (Read Uncommitted) 允许读取未提交的数据,可能导致脏读、不可重复读和幻读。
读已提交 (Read Committed) 只能读取已提交数据,避免了脏读,但仍可能发生不可重复读和幻读。
可重复读 (Repeatable Read) 确保同一事务中多次读取数据一致,防止脏读和不可重复读,但可能出现幻读。
串行化 (Serializable) 最高的隔离级别,事务串行执行,避免所有并发问题,但性能开销大。
  • 读未提交(Read Uncommitted):此级别下,事务可以读取未提交的数据,可能导致 脏读、不可重复读和幻读
  • 读已提交(Read Committed):事务只能读取 已提交 的数据,避免了 脏读,但仍然可能出现 不可重复读和幻读
  • 可重复读(Repeatable Read):保证在同一事务中 多次读取相同数据的结果一致,避免了 脏读和不可重复读,但仍可能出现 幻读(MySQL 默认隔离级别)
  • 串行化(Serializable):最高的隔离级别,事务之间 完全串行化执行,避免所有并发问题,但 性能较差

存储引擎

MySQL体系结构

简介

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型

MySQL 常见存储引擎及特点

存储引擎 事务支持 锁机制 适用场景 主要特点
InnoDB ✅ 支持 行锁 事务处理、并发高的应用 - 默认存储引擎,支持 ACID 事务
- 使用 MVCC 避免读写冲突
- 采用 聚簇索引 提高查询性能
- 支持外键
MyISAM ❌ 不支持 表锁 读操作多、对事务要求不高的应用 - 适用于大量 SELECT 读取的场景
- 由于表锁,写入性能较差
- 不支持事务和外键
- 索引和数据分开存储,查询性能较高
MEMORY ❌ 不支持 表锁 需要高速访问临时数据的应用 - 将数据存储在内存中,查询速度极快
- 断电或重启后数据丢失
- 适用于临时表或缓存数据
CSV ❌ 不支持 表锁 需要以 CSV 形式存储数据的应用 - 数据存储为 文本格式
- 适用于数据导入、导出
- 不支持索引,查询性能较低
Archive ❌ 不支持 表锁 归档大量历史数据 - 只支持 INSERTSELECT,不支持 DELETEUPDATE
- 适用于日志归档或历史数据存储
- 高压缩比,节省存储空间
Blackhole ❌ 不支持 表锁 需要复制数据但不存储数据 - 任何插入的数据都会消失
- 常用于主从复制,作为中间转发引擎
Federated ❌ 不支持 行锁 访问远程 MySQL 数据库 - 允许访问 远程数据库表
- 适用于分布式架构
- 需要远程 MySQL 服务器支持

选择存储引擎的建议:

  • 如果需要事务、并发高InnoDB
  • 如果只读操作多,事务不重要MyISAM
  • 如果需要高速缓存数据MEMORY
  • 如果数据存储要以文本格式CSV
  • 如果要归档数据,节省存储空间Archive
  • 如果数据不需要存储,仅用于复制Blackhole
  • 如果要访问远程 MySQL 数据Federated