MVCC
- 多版本并发控制(可以认为MVCC是行级锁的一个变种),在很多情况下避免了加锁的操作,因此开销很低
- 实现:通过保存数据在某个时间点的快照来实现的,换句话说不管需要执行行多长时间,每个事物看到的数据都是一致的。
MVCC分类
- 悲观并发控制和乐观并发控制
- 只在repeatable read(rr)和read committed(rc)两个隔离级别下工作
MVCC 三个部分
第一阶部分
- 隐藏字段主要包括每一行记录上都会包含几个用户不可见的字段(DB_TRX_ID/DB_ROW_ID/DB_ROLL_PTR)
- 分别是创建或最后一次修改记录的事务id、隐藏主键、回滚指针
第二部分
- undolog --> 回滚日志
第三部分
- readview:事务在进行快照读的时候产生的读视图
- 主要包括(trx_list:系统活跃的事务id)
- up_limit_id:列表中事务最小的id
- low_limit_id:系统尚未分配的下一个事务id
InnoDB
- 采用MVCC来支持高并发,默认级别是RR(可重复读),并且通过间隙锁策略防止幻读的出现
- 使用行锁,并且支持事务
MyISAM
- 对整张表进行加锁(表锁)
索引
- 排好序的快速查找数据结构
- 降低了数据库排序的成本
- 降低了数据库的IO成本
- 创建索引会占用空间
索引分类
- 单值索引:一个索引只包含单个列,一个表可以有多个单列索引
- 唯一索引:索引列的值必须唯一,但允许有空值
- 主键索引:定为主键后数据库会自动建立索引,innodb为聚簇索引
- 复合索引:即一个索引包含多个列 #B+和B树
B+树中每个记录的查找时间基本是一样的,都需要从根节点走到叶子节点,而且在叶子节点中还要再比较关键
字。从这个角度看 B树的性能好像要比 B+树好,而在实际应用中却是 B+树的性能要好些。
因为 B+树的非叶子节点不存放实际的数据, 这样每个节点可容纳的元素个数比 B树多,树高比 B树小,
这样带来的好处是减少磁盘访问次数。
Binlog -- 二进制文件
- Binlog 是逻辑日记,用于记录数据库执行的写入操作(查询不记录)信息,Server 层记录和引擎层无关,并且是以追加方式进行写入
- 可以通过参数 max_binlog_size 设置每个 Binlog 文件的大小,文件大小达到设定值时会生成新的文件来保存日记。 作用:
- 主从复制场景:在 Master 主端开启 Binlog,将 Binlog 发生到各个 Slave 从端,Slave 从端重放 Binlog 从而达到主从数据一致
- 数据恢复场景:通过使用 mysqlbinlog 工具来恢复数据
Undo log -- 事务日记
Undo log是 逻辑日记 、回滚日记。比如一条修改 +3 的逻辑语句,Undo log 会记录对应一条 -3 的逻辑日记,一条插入语句则会记录一条删除语句,这样发生错误时,根据执行 Undo log 就可以回滚到事务之前的数据状态。
作用:
- 回滚数据:当程序发生异常错误时等,根据执行 Undo log 就可以回滚到事务之前的数据状态,保证原子性,要么成功要么失败。
- MVCC 一致性视图:通过 Undo log 找到对应的数据版本号,是保证 MVCC 视图的一致性的必要条件。
总结:
- 获取数据,查看数据页是否在内存中,如果不在那么磁盘读入内存
- 如果在那么久返回数据,更改数据,再写入新的数据
- 新数据更新到内存,从而写入redo,出于prepare阶段
- 写入binlog,提交事务,出于commit状态