11.BufferPool之预读失效优化

30 阅读3分钟

预读失效优化:新老代+老年代+停留时间窗口

预读失效优化:主要针对的是通过线性预读加载进来的缓存页,某些缓存页被预读加载进来以后是会被用到的,但是某些缓存页被预读加载进来并没有用到,此时这些没有被用到的缓存页要被快速淘汰!

预读失效优化:主要针对的是通过线性预读加载进来的缓存页,某些缓存页被预读加载进来以后是会被用到的,但是某些缓存页被预读加载进来并没有用到,此时这些没有被用到的缓存页要被快速淘汰!

预读失效优化:主要针对的是通过线性预读加载进来的缓存页,某些缓存页被预读加载进来以后是会被用到的,但是某些缓存页被预读加载进来并没有用到,此时这些没有被用到的缓存页要被快速淘汰!

1.让预读失败的页,停留在缓冲池LRU里的时间尽可能短;

2.让真正被读取的页,才挪到缓冲池LRU的头部以保证真正被读取的热数据留在缓冲池里的时间尽可能长。

具体方法是:

(1)将LRU分为两个部分:新生代(new sublist) 和 老生代(old sublist)

(2)新老生代收尾相连,即:新生代的尾(tail)连接着老生代的头(head);

(3)新页(例如被预读的页)加入缓冲池时,只加入到老生代头部:

如果数据真正被读取(预读成功),才会加入到新生代的头部

如果数据没有被读取,则会比新生代里的“热数据页”更早被淘汰出缓冲池

image.png

举个例子,整个缓冲池LRU如上图:

(1)整个LRU长度是10;

(2)前70%是新生代;

(3)后30%是老生代;

(4)新老生代首尾相连;

image.png

假如有一个页号为50的新页被预读加入缓冲池:

(1)50只会从老生代头部插入,老生代尾部(也是整体尾部)的页会被淘汰掉;

(2)假设50这一页不会被真正读取,即预读失败,它将比新生代的数据更早淘汰出缓冲池;

image.png

假如50这一页立刻被读取到,例如SQL访问了50页内的1行数据:

(1)如果50这个缓存页立刻被访问,它会被立刻加入到新生代的头部。

(2)新生代的页会被挤到老生代,此时并不会有页面被真正淘 汰;

改进版缓冲池LRU能够很好的解决“预读失败”的问题。

画外音:但也不要因噎废食,因为害怕预读失败而取消预读策略,大部分情况下,局部性原理是成立的,预读是有效的。

但是新生代+老生代改进版的LRU散发仍然解决不了缓冲池污染的问题。

参考:blog.csdn.net/qq_34436819…