buffer pool

buffer pool 顾名思义缓冲池,是innodb引擎与具体磁盘数据的缓冲池,同cpu的L1,L2缓存 缓冲池中有很多页,而每页就是innodb的页(默认为16kb),innodb引擎在读取数据时最小会取出一页的数据,这样正好放在缓冲池中

Xnip2021-06-11_20-51-17.jpg
image.png

free(空闲)链表

记录buffer pool中的空闲缓冲区块 在需要使用时从链表头部取出使用

flush(脏页)链表

记录buffer pool中被修改并且没有同步到磁盘的页 会有线程定时同步到磁盘

lru(最近最少使用)链表

当没有空闲页可供使用时,会从链表尾部取出页使用 最新使用的页会放在链表最前面 lru链表会分为两部分,热数据区和冷数据区(所有页的3/8),这样是为了避免在进行大量读取(如全表扫描)时,将缓冲区全部使用掉,这种情况下,最多只会使用所有的冷数据区

innodb修改数据流程

  1. 修改buffer pool页数据(脏页)
  2. update->redo log&undo log持久化->binlog持久化
  3. 修改成功

事务流程

  1. 修改buffer pool页数据(脏页)
  2. update->log buffer
  3. 事务提交->redo log持久化->binlog持久化
  4. 事务回滚
  5. 修改成功

事务提交后会根据innodb对脏页的设置选择是否立即持久化
WechatIMG81.png