mysql-log+可重复读(mvcc)

目录

redoLog

innodb_log_buffer_size

 redologBuffer刷到磁盘的时机

 事务redoLog数据流转

undoLog

mvcc = ReadView + UndoLog多版本链条


redoLog

redo log不是单行单行的写入日志文件的,他是用一个redo log block来存放多个单行日志的。

一个redo log block是512字节,这个redo log block的512字节分为3个部分,一个是12字节的header块头,一个是496字节的body块体,一个是4字节的trailer块尾

innodb_log_buffer_size

指定这个redo log buffer的大小,默认的值就是16MB

 redologBuffer刷到磁盘的时机

1. 如果写入redo log buffer的日志已经占据了redo log buffer总容量的一半了,也就是超过了8MB的redo log在缓冲里了,此时就会把他们刷入到磁盘文件里去
2. 一个事务提交的时候,必须把他的那些redo log所在的redo log block都刷入到磁盘文件里去,只有这样,当事务提交之后,他修改的数据绝对不会丢失,因为redo log里有重做日志,随时可以恢复事务做的修改
3. 后台线程定时刷新,有一个后台线程每隔1秒就会把redo log buffer里的redo log block刷到磁盘文件里去
4. MySQL关闭的时候,redo log block都会刷入到磁盘里去
5. 瞬间执行大量的高并发的SQL语句,1秒内就产生了超过8MB的redo log,此时占据了redo log buffer一半的空间了,必然会直接把你的redo log刷入磁盘里去

redoLog磁盘文件

redoLog磁盘上保存的文件,是循环复写的,当分配的所有的文件都被写满的时候,会从第一个文件开始覆盖

redoLog数据覆写导致性能抖动

redoLog磁盘文件这种复写方式,可能会导致,更新操作出现性能上的抖动

原因1:

当在进行覆写的时候,但是这个时候,覆写的那部分数据对应的内存里的缓存页的数据有没有被刷到磁盘上的数据页,此时需要先将内存里的脏页数据刷入到磁盘的数据页,然后才能添加新的redoLog数据

原因2:

在刷内存里的脏页的时候,发现redoLog文件被填满,然后需要进行覆写,发现要被覆盖的数据也是脏页,需要刷入磁盘,此时就会出现死循环,数据库直接hang死,无法处理任何更新请求

原因3:

一次查询的数据量太大,此时内存的buffer pool已经漫了,需要先将缓存中的缓存页flush(buffer pool漫的时候才会执行flush)到磁盘上(随机IO),刷盘速度太慢,查询的时候就会很慢

解决方式:

innodb_io_capacity 设置为磁盘最大的随机IO次数 

innodb_flush_neighbors,他意思是说,在flush缓存页到磁盘的时候,可能会控制把缓存页临近的其他缓存页也刷到磁盘,但是这样有时候会导致flush的缓存页太多了。如果磁盘是是SSD固态硬盘,并没有必要让他同时刷邻近的缓存页,将innodb_flush_neighbors设置为0,禁止刷临近缓存页,这样就把每次刷新的缓存页数量降低到最少。

事务redoLog数据流转

事务执行的时候,redo log都进入redo log buffer,提交事务的时候,事务对应的redo log必须是刷入磁盘文件,接着才算是事务提交成功,否则事务提交就是失败,保证这一点,就能确保事务提交之后,数据不会丢,有redo log在磁盘里就行了,当然,绝对保证数据不丢,还得配置一个参数,提交事务把redo log刷入磁盘文件的os cache之后,还得强行从os cache刷入物理磁盘

undoLog

 主键

如果你自己指定了一个主键,那么可能这个主键就是一个列,比如id之类的,也可能是多个列组成的一个主键,比如“id+name+type”三个字段组成的一个联合主键,也是有可能的。所以这个主键的各列长度和值,意思就是你插入的这条数据的主键的每个列,他的长度是多少,具体的值是多少。即使你没有设置主键,MySQL自己也会给你弄一个row_id作为隐藏字段,做你的主键。

表id

接着是表id,这个就不用多说了,你插入一条数据必然是往一个表里插入数据的,那当然得有一个表id,记录下来是在哪个表里插入的数据了

日志编号

undo log日志编号,这个意思就是,每个undo log日志都是有自己的编号的。在每个事务里的undo log日志的编号都是从0开始的,然后依次递增。

日志类型

至于undo log日志类型,就是TRX_UNDO_INSERT_REC,insert语句的undo log日志类型就是这个东西。

日志结束位置

最后一个undo log日志的结束位置,这个自然也不用多说了,他就是告诉你undo log日志结束的位置是什么。

mvcc = ReadView + UndoLog多版本链条

多事务串行 

多事务并行 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值