学习笔记,来源黑马程序员MySQL教程
文章目录
- 逻辑存储结构
- 架构
- 内存架构
- 磁盘结构
- 后台线程
- 事务原理
- 概述
- redo log
- undo log
- MVCC
- 基本概念
- 实现原理
- 1、隐藏字段
- 2、undo log
- 3、readview
- 总结
逻辑存储结构
- 一个表空间对应一张表
- 一 页 对应B+树上一个 节点
- Trx id:最后一次使用的id
架构
内存架构
- 假设没有缓冲区,执行增删改查的时候,每一次数据库都要去操作磁盘空间,就会引起大量的磁盘IO(在业务比较复杂的系统中,大概率是随机IO),性能极低。
- Buffer Pool:缓冲池,池中存放的最小单位是页
- Change Buffer:更改缓冲区,针对非唯一的二级索引
- MySQL服务器通常会将80%的内存分配给缓冲区,以提高执行效率
磁盘结构
- 当事务提交后,redo log的意义就不大了,它是用来保证出现异常时做数据恢复(持久性)。
后台线程
- AIO:异步非阻塞IO,提高性能
- 业务操作时,会操作整块缓冲区,如果缓冲区没有数据,将磁盘数据加载到缓冲区中,然后进行增删改查。缓冲区会以一定频率通过后台线程刷新到磁盘空间,之后在磁盘空间进行永久化保存。
事务原理
概述
redo log
-
脏页:数据已经被修改过的页,但还没有刷新到磁盘中;
-
在没有使用redo log的时候,产生脏页通过后台线程以一定时机刷新到磁盘中,有可能出错,此时就无法保证数据的持久性,如下图:
-
在用到redo log时,首先将增删改的数据记录到 redolog buffer 上 ,当事务提交时,就将该变化的页记录到磁盘上的日志文件(redo log file)中。
-
如果缓冲池刷新到磁盘上出问题,就可以通过redo 日志文件进行恢复。
Q:为什么不在每一次事务提交的时候就将buffer pool的数据刷新到磁盘中?
A:存在严重的性能问题,事务中的每一个操作都是随机地操作记录,会涉及到大量地随机磁盘IO,而redo log 只刷新日志文件(以追加的方式,是顺序磁盘IO),性能高于随机磁盘IO。
即 WAL(write-ahead-logging)。
- 当脏页的数据顺利地刷新到磁盘当中,此时redo log当中记录的日志文件也就不需要了,所以每隔一段时间就会清理redo 日志文件,所以ib_logfile0/1 是循环写的,不会永久保存。
undo log
MVCC
基本概念
InnoDB默认隔离级别是可重复读,所以当一个事务未提交前,查询到的结果都是相同的,而有可能同一时间其他事务已经将数据修改过,所以第一个事务读取到的数据实际上已经是错误的,这就是快照读。
实现原理
1、隐藏字段
-- 查看stu表的表结构
ibd2sdi stu.ibd
2、undo log
3、readview
RC隔离级别下,根据readview读取到的记录。
- 一致性:事务在执行之前和执行之后是一致的,那么操作如果执行失败,则全部回滚,执行成功则必须更新,而回滚由undo log、更新由redo log管理
总结
- 表空间:包含独占表空间、系统表空间、通用表空间
- 一个区1M、一个页16K,所以一个区包含64个连续的页,InnoDB引擎分配空间时一次性申请4-5个区,以保证页的连续
- MVCC:在快照读的时候根据MVCC查找历史版本