buffer pool
buffer pool 顾名思义缓冲池,是innodb引擎与具体磁盘数据的缓冲池,同cpu的L1,L2缓存 缓冲池中有很多页,而每页就是innodb的页(默认为16kb),innodb引擎在读取数据时最小会取出一页的数据,这样正好放在缓冲池中
free(空闲)链表
记录buffer pool中的空闲缓冲区块 在需要使用时从链表头部取出使用
flush(脏页)链表
记录buffer pool中被修改并且没有同步到磁盘的页 会有线程定时同步到磁盘
lru(最近最少使用)链表
当没有空闲页可供使用时,会从链表尾部取出页使用 最新使用的页会放在链表最前面 lru链表会分为两部分,热数据区和冷数据区(所有页的3/8),这样是为了避免在进行大量读取(如全表扫描)时,将缓冲区全部使用掉,这种情况下,最多只会使用所有的冷数据区
innodb修改数据流程
- 修改buffer pool页数据(脏页)
- update->redo log&undo log持久化->binlog持久化
- 修改成功
事务流程
- 修改buffer pool页数据(脏页)
- update->log buffer
- 事务提交->redo log持久化->binlog持久化
- 事务回滚
- 修改成功
事务提交后会根据innodb对脏页的设置选择是否立即持久化

