MySQL技术内幕
第二章 InnoDB存储引擎
行锁设计、支持MVCC(多版本并发控制)、支持外键、提供一致性非锁定读
InnoDB体系架构
后台线程:(1)负责刷新内存池中的数据,保证缓存池中的内存缓存是最近的数据;
(2)将已修改的数据文件刷新到磁盘文件,保证能够异常回复
内存
缓冲池
InnoDB存储引擎基础磁盘存储,并将其中的记录按照页的方式进行管理,缓冲池就是一块内存区域,通过内存的速度来弥补磁盘速度较慢的影响
修改操作首先修改在缓存中的页,然后再以一定的频率刷新到磁盘上(Checkpoint机制)
LRU List、FreeList、Flush List
数据库中的缓冲池通过LRU(最近最少使用)算法来进行管理,最频繁使用的页在LRU列表的前端,当缓冲池不能存放新读取到的页时,将首先释放LRU列表中尾端的页
在InnoDB中缓冲池中页的大小默认16KB,LRU列表加入midpoint位置,新读取到的页放入到midpoint位置而非首部,默认该位置在LRU列表长度的5/8处
在InnoDB中把midpoint之后的列表成为old列表,之前的列表称为new列表
为什么引入midpoint:防止将尽在这次查询操作中需要的页放入首部导致热点数据页被移除(全表扫描引起LRU列表被污染)
另外引入一个time参数用于表示需要等待多久才会被加入到LRU列表的热端
Free列表:维护空闲可分配的缓冲页
缓存页申请流程:
(1)从Free列表中查找是否由可用的空闲页
(2)有则将该页删除放入LRU列表中
(3)无则淘汰LRU列表末尾分配给新页
对于非16KB的页采用伙伴算法进行内存分配
脏页:LRU列表上的页被修改后(缓冲池中的页)