天天看点

innodb的缓冲池(buffer pool)

缓冲区是主内存中存储访问的表和索引的区域。缓冲池允许经常访问的数据直接从内存处理,更加高效。

为了提高大容量读取操作的效率,缓冲池被划分为可以容纳多行数据的页(page)。为了高效管理缓存,缓冲池被实现为页(page)的列表,缓存删除用lru算法的变种实现。

下图为缓冲池的结构:

innodb的缓冲池(buffer pool)

head部存储的是最近访问的数据,tail部是最近最少访问的。

默认情况下,3/8的缓冲池用作old sublist。

当innodb读取一个页到缓冲池,首先插入到old sublist的头部,页中的数据被读取可能是用户访问(如SQL查询)或者innodb自动执行的预处理,访问old sublist中的数据会使它变“young”,移动它到new sublist的头部。如果页因为用户访问被读取,则立即进行第一次访问,并且页面变“young”。如果是因为预读取,第一次访问不会发生,并且可能永远不会发生(直到被丢弃),这样可以防止扫描表或者索引的时候冲掉缓冲池中的热数据,因为扫描的数据随后可能永远都不会访问。

随着数据库操作,缓冲池中不被访问的页会变老(age)并移向表尾。当其他的数据变新(new)的时候,new sublist和old sublist都会变老。old sublist中的页会因为在缓冲池中间(new sublist和old sublist交界处)插入页而变老。最终持续不用的页会到达链表结尾然后被丢弃。