预读失效优化:新老代+老年代+停留时间窗口
预读失效优化:主要针对的是通过线性预读加载进来的缓存页,某些缓存页被预读加载进来以后是会被用到的,但是某些缓存页被预读加载进来并没有用到,此时这些没有被用到的缓存页要被快速淘汰!
预读失效优化:主要针对的是通过线性预读加载进来的缓存页,某些缓存页被预读加载进来以后是会被用到的,但是某些缓存页被预读加载进来并没有用到,此时这些没有被用到的缓存页要被快速淘汰!
预读失效优化:主要针对的是通过线性预读加载进来的缓存页,某些缓存页被预读加载进来以后是会被用到的,但是某些缓存页被预读加载进来并没有用到,此时这些没有被用到的缓存页要被快速淘汰!
1.让预读失败的页,停留在缓冲池LRU里的时间尽可能短;
2.让真正被读取的页,才挪到缓冲池LRU的头部以保证真正被读取的热数据留在缓冲池里的时间尽可能长。
具体方法是:
(1)将LRU分为两个部分:新生代(new sublist) 和 老生代(old sublist)
(2)新老生代收尾相连,即:新生代的尾(tail)连接着老生代的头(head);
(3)新页(例如被预读的页)加入缓冲池时,只加入到老生代头部:
如果数据真正被读取(预读成功),才会加入到新生代的头部
如果数据没有被读取,则会比新生代里的“热数据页”更早被淘汰出缓冲池
举个例子,整个缓冲池LRU如上图:
(1)整个LRU长度是10;
(2)前70%是新生代;
(3)后30%是老生代;
(4)新老生代首尾相连;
假如有一个页号为50的新页被预读加入缓冲池:
(1)50只会从老生代头部插入,老生代尾部(也是整体尾部)的页会被淘汰掉;
(2)假设50这一页不会被真正读取,即预读失败,它将比新生代的数据更早淘汰出缓冲池;
假如50这一页立刻被读取到,例如SQL访问了50页内的1行数据:
(1)如果50这个缓存页立刻被访问,它会被立刻加入到新生代的头部。
(2)新生代的页会被挤到老生代,此时并不会有页面被真正淘 汰;
改进版缓冲池LRU能够很好的解决“预读失败”的问题。
画外音:但也不要因噎废食,因为害怕预读失败而取消预读策略,大部分情况下,局部性原理是成立的,预读是有效的。
但是新生代+老生代改进版的LRU散发仍然解决不了缓冲池污染的问题。