1. 缓冲池说明
缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。
对于数据库中页的修改操作,则首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。这里需要注意的是,页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为Checkpoint的机制刷新回磁盘。同样,这也是为了提高数据库的整体性能。
○ 缓冲池架构图
2. 缓冲池管理
缓冲池维护着这么几个列表分别是:
LRU list Free list Flush list
在innoDB存储引擎对传统LRU做了一些优化,InnoDB存储引擎的LRU加入了midpoint位置,新读取到的页虽然是最新访问的,但是不是直接放到LRU列表的首部,而是放到LRU列表的minpoint位置,默认位置是距离LRU列表尾端 5/8处;
在InnoDB存储引擎中,把midpoint之后的列表称为old列表,之前的列表称为new列表。可以简单地理解为new列表中的页都是最为活跃的热点数据。
因为索引或者数据扫描操作会频繁访问表中许多页,甚至全部页,而这些页通常仅是这次查询操作中需要的,并不是活跃的热点数据,如果把这些数据放到LRU列表首部,很可能将所需要的的热点数据页从LRU列表中移除。
innoDB存储引擎引入另一个参数进一步管理LRU列表,这个参数是 innodb_old_blocks_time,用于表示读取到mid位置后需要等待多久才会被加入到LRU列表的热端。
Free List负责存放空闲页,LRU list 从 Free列表取出页放入到列表,然后Free列表删除被取走的页,当Free列表无空闲页则根据LRU算法淘汰末尾的页,将该页空间分配给新的页。
在LRU列表的页被修改后,称该页为脏页,也就是说缓冲池中页的数据和磁盘上也的数据产生了不一致。这时数据库会通过CHEKPOINT机制将脏页刷新回磁盘。
Flush list 即为脏页列表,脏页即存在于LRU列表也存在于Flush列表,二者互不影响。
LRU list 列表用来管理缓冲池中页的可用性;
Flush list 列表用来管理奖页重新刷回到磁盘;
崔世峰的博客 - cuishifeng.life