MySQL buffer poll与日志


Buffer Pool结构图

在这里插入图片描述


Buffer Pool相关参数配置项

在这里插入图片描述
注意:InnoDB开头的都为InnoDB所特有的配置


Buffer Pool中核心三个链表

在这里插入图片描述
MySQL并不是直接从磁盘中取数据进行操作

Buffer Pool为MySQL启动后开辟的一块内存,默认128M

当从磁盘读取数据时,会将数据所在的那一页(MySQL预读页 16KB)放入Buffer Pool中,这样方便下次读取该页里面的数据时加快读取速度。

在这里插入图片描述

MySQL通过三种链表结构来管理Buffer Pool里面的页。

  1. free链表管理的是Buffer Pool里面空闲的位置,因为随着页的插入删除,里面的可定会出现不连续的空闲区域。因此将所有空闲区域用链表来管理,每当使用一个空闲区域,就将链表里面对应管理的空闲块删除。
    free链表

  2. flush链表管理的是对应页里面发生数据更改等操作(脏页),但是系统如何知道哪个页是发生了数据更改呢,因此用flush来管理所有脏页,每当那个页面里面发生了数据更改的操作,就将该页加入flush链表中。因此系统直接遍历这个flush链表来进行后续的持久化等操作。
    在这里插入图片描述

  3. LRU链表主要负责的是Buffer Pool里页面满时,应该丢弃哪个页面的一种页面淘汰机制。使用热度高的数据在表头,热度低的在表位,删除页面时即丢弃LRU链表末尾对应的页。

  • 若此时产生 select *操作,就会将Buffer Pool里面所有热度数据全部给删掉
    为了解决上述问题,对LRU进行改进:

在这里插入图片描述
将LRU链表分成两部分,前5/8部分为热数据区域,后3/8部分为冷数据区域
当冷数据最前面的页面两次访问的时间间隔大于1秒时就将此冷数据视为热数据并加入热数据链表头部。
注意:这个大于1秒解决了上述select删除热数据问题,因为select会使得那个页面连续频繁访问(全表扫描,已经加载带内存里面了,扫描很快),因此时间间隔小于1秒,仍然视为冷数据。
在这里插入图片描述


日志

在这里插入图片描述


redolog

在这里插入图片描述
开启事务后,第一次update操作先更新Buffer Pool里面的数据,再生成一个redolog对象,当事务提交后,再将redolog持久化进磁盘中。

  • redolog存在的目的在于:
  1. 当将本次事务中所有发生更改的数据写入磁盘时,若发生意外MySQL进程中断等问题,重启后依然可以从redolog中重新持久化进磁盘中。
  2. redolog为顺序IO,(看最前面那个总原理框图),redolog为系统在磁盘预定义好的区域(大小和块数都可以修改),这样将redolog里面的操作更新磁盘中的数据时就可以连续读取(磁盘寻址都在一起,加速该处理过程,也加速并发过程中的处理速度)
    (好比喻为饭店记账,当人特别多的时候,我们不是将每个人都去翻账本去记录,而是将每个来吃饭的人都记在一个临时记录本上(redolog),等闲下来以后再慢慢去账本(磁盘)里面更新对应的人)

随机IO:没有redolog,更新磁盘数据时就为随机IO,因为磁盘数据物理上不连续,需要更多的寻址处理时间。

注意:MySQL向磁盘写入redolog时,中间要经过操作系统缓存。。这是因为防止log buffer磁盘写入redolog时因为突然进程崩溃导致的写入失败。先写入操作系统缓存,就可以避免这种问题出现。

innodb_flush_log_at_trx_commit配置
在这里插入图片描述
在这里插入图片描述
0和2都是写入操作系统缓存,但是0是由MySQL自身的线程去做,一旦sql进程崩溃会导致数据直接丢失。。。

默认情况下是1,安全性较高,但是并发量大时会有效率低问题


undolog

负责事务回滚 rollback
负责MVCC
在这里插入图片描述


binlog

主从同步
redolog是InnoDB特有的


Doublewrite Buffer files

由最前面的Buffer Pool原理图可知,这个文件位于磁盘中。

MySQL一次操作页的大小为16KB,而操作系统的页大小为4KB,当事务提交后向磁盘持久化数据时,需要先向Doublewrite Buffer files中写入,写入完成再向磁盘中数据真正存在的地方去更新数据。

Doublewrite Buffer files就是为了防止由于MySQL崩溃等意外情况,导致只向磁盘持久化了一部分数据。有了Doublewrite Buffer files这可以在MySQL崩溃后保持磁盘数据不会出现新老并存的混乱。当Doublewrite Buffer files写入完成,就会删掉本次事务的redolog。

另外,由于MySQL崩溃等意外情况,依然可能导致Doublewrite Buffer files只写了一部分进去,这个并不影响,因为磁盘中还有redolog,根据它可以重新写Doublewrite Buffer files。


Changer Buffer

修改某一行数据时,并不是单纯取出那一页放入Buffer poll然后修改数据就可以,还可能需要修改对应的索引。而索引页在另外的地方,每一次update就把数据,索引页全部放入Buffer poll改了,这涉及多次磁盘IO,显然影响效率。

Changer Buffer主要是当update操作时,只将数据页放入Buffer poll中,同时复制一份放入changer buffer中,索引页暂时不取。当后续操作用到索引页时就将其加入changer buffer,放入的索引页如果就是前面修改数据对应要修改的索引页时,就对应将该索引页修改,然后再放入Buffer poll中。。。这样减少了磁盘IO的次数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VioletEvergarden丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值