——缓冲池
InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理,因此可将其视为基于磁盘的数据库系统。在数据库系统中,由于CPU速度与磁盘速度的鸿沟,基于磁盘的数据库系统通常需要缓冲池技术提高整体性能
缓冲池简单而言是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。
在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,下一次读取到相同的页时,首先判断该页是否在缓冲池中,若在则命中,直接返回,否则需要从磁盘读取。
对于数据库中页的修改操作,首先修改缓冲池中的页,然后在以一定频率刷新到磁盘上。页从缓冲池刷新到磁盘并不是在页发生更新时触发,而是通过一种checkpoint机制刷新回磁盘,这样做目的提高性能
查看InnoDB缓冲池大小
缓冲池缓存的数据页类型:索引页、数据页、undo页、插入缓冲、InnoDB存储的锁信息、数据字典等。
从高版本InnoDB开始,允许有多个缓冲池实例。每个页根据hash值分配到不同的缓冲池中,增加了数据库并发处理能力
——LRU List , Free List , Flush List
通常而言,数据库中的缓冲池通过LRU算法(最近最少使用)算法进行管理。即最频繁使用的页在LRU列表的前端,而最少使用的页在LRU列表的末尾。当缓冲池不能存放新读取的页时,首先释放LRU列表末尾的页
在InnoDB存储引擎中,缓冲池页的大小默认是16KB,同样使用LRU算法对缓冲池进行管理。但InnoDB还增加了midpoint位置,新读取到的页不是立即放入LRU列表首端,而是放入LRU列表的midpoint位置。默认是位于LRU列表的5/8位置
通常将midpoint之后的表称为old列表,而之前的列表称为new列表,即new列表中的页都是最为活跃的数据
为什么不采用朴素的LRU算法的原因是,某些SQL操作可能会使缓冲池中的页被刷新出,从而影响缓冲池的效率1.如常见的扫描操作。这些操作需要访问表中的许多页,但通常只是简单的查询,并不是严格意义的热点数据
LRU列表用来管理已经读取的页,但数据库刚启动时,LRU列表为空,即没有任何的页。这时页放置在Free列表中。当需要缓冲池分页时,首先从Free列表中查找是否有空闲页,若有则将该页从Free列表中删除,放入LRU列表中。否则,根据LRU算法,淘汰LRU列表末尾的页。