预读
MySQL是以页(16K)为单位读取磁盘数据放入buffer pool的,按页读取不仅能提高性能,还遵守“集中读写”的原则能把一些“可能要访问”的页提前加入缓冲池,避免未来的磁盘IO操作。
LRU链表
MySQL是用LRU(Least recently used)算法来管理这些缓存页的。并将LRU链表分为young和old两个区域。首次从磁盘上加载到buffer pool的页放到老年代头部,如果数据被访问则加到新生代的头部;如果数据没被访问则会被逐渐移到老年代尾部直到淘汰。
注意:在一定时间内访问初次加载到buffer pool的页不会被加到新生代的头部,这个时间由innodb_old_blocks_time变量控制。这是针对全表扫描时,短时间内访问大量使用频率非常低的页面情况的优化。
flush链表
如果修改了buffer pool中某个缓存页的数据,那它就和磁盘上的页不一致了,这样的缓存页被称为脏页(dirty page)。
buffer pool内创建一个存储脏页的链表,凡是修改过的缓存页对应的控制块都会作为一个节点加入到一个链表中,因为这个链表节点对应的缓存页都是需要被刷新到磁盘上的,所以也叫flush链表。
写缓冲(change buffer)
自我介绍一下,小编13