由于硬盘和内存的造价差异,一台主机实例的硬盘容量通常会远超于内存容量。对于数据库等应用而言,为了保证更快的查询效率,通常会将使用过的数据放在内存中进行加速读取。
数据页与索引页的LRU
数据页和索引页的目的在于缓存一部分的表数据和索引数据,其数据总量通常会超过缓冲池大小,所以缓冲池中应只缓冲那些经常使用的热点数据。InnoDB内存管理使用的是最近最少使用(Least Recently Used, LRU)算法。来淘汰最久未使用的数据。

在一般的LRU算法中,当链表中的某一个数据被读取时,将会将其放置于队首。当新增数据且链表已达最大数量时,将链表尾部的数据移除,并将新增的数据置于链表首部。
InnoDB的LRU并没有使用传统的双端链表,而是做了改进,这里有两个问题:
- 预读失效
- 缓冲池污染
优化预读失效
由于预读(Read-Ahead),提前把页放入了缓冲池,但最终 MySQL 并没有从页中读取数据,称为预读失效。
Read-Ahead机制
Read-Ahead用于异步预取buffer pool中的多个page的一个预测行为。

订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



