MVCC
多版本并发控制是mysql的innodb采用的并发控制方案,在可重复读下默认使用该并发控制方案
原理:
- MySQL全局维护一个递增版本号
- 表结构有两个隐藏的列,分别代表 初始化时版本 和 过期时版本
- 新增一条记录时——物理写入一条新数据,设置初始化版本为当前Mysql版本号,过期时版本为空
- 更新一条记录时——将旧的物理数据行的过期时版本设置为当前Mysql版本号,不改动旧物理数据,重新物理写入一条新纪录,初始化版本填写当前Mysql版本号,新物理数据使用更新后的数据
- 删除一条记录——将数据库保存的该主键对应的最新一条物理数据(过期时版本为空)的记录的过期时版本设置为当前Mysql版本号
- 查询数据——找到 【过期时版本为空】 或者 【初始化版本<=当前mysql全局版本 并且 过期时版本>= 当前mysql全局版本】 的数据
总结:通过多条记录,多版本,只做增量的方式来保证可重复读和并发控制(版本校验)
myisam引擎
索引和数据分开在两个文件,因此支持行锁性能不好保障,所以没有设计支持行锁和事务
崩溃后数据恢复困难
但是myisam的存储是紧密存储,结构简单,适用于只读数据库(一经导入不再修改),可以提高更好的性能
对其进行压缩后得到压缩表,一般用于只读数据
Innodb
b+树存储索引和数据,叶节点就是数据
支持行锁和