每当我们想要缓解读,一般会想到什么?预读取,缓存。
缓存,其实就是将高频访问的数据放到内存里面,减少读盘的次数。
为了提高内存的利用率,MySQL还建立了缓存池,也就是buffer pool,存储最热的数据页和索引页。
从Linux的文件系统我们就知道,计算机的读取是按页来的。那么,我们是不是可以将下一页提前取出来,反正是一次磁盘IO。
提到缓存和预读取,LRU是跑不了的,简单地说,就是将池子里面待的最久的内存淘汰掉,放入新的数据。
那么,缺点有没有?预读失效:你放了我不读。不就浪费了内存么。
凡是要区别对待,就将他们隔离开来。
我们想要的就是真正读取的数据缓存起来,预读的数据级别低一点,稍微缓存一下就好了。
那么,很简单,把内存池分段,一段存真正读的,一段存预读的。
这就是新生代(new sublist)和老生代(old sublist),新的尾就是老的头。
逻辑不变,但是可以配置长度,比如新的站70%,老的占30%,老的由于比较短,就会更快淘汰。
那么, 完美了么?
凡是要防止区别对待的事务强行混合,就添加阈值,让低一级的过不来。
将所有的数据都先丢到老的里面,停留时间大于T,才能进入新生代,这样老的就在不断被刷新,而真正需要的会逐渐进入新生代。
本文来源:博客园,转载请注明出处!
来源地址:https://www.cnblogs.com/HappyTeemo/p/15517369.html
新文推荐
© 2016 - 2022 chengxuzhixin.com All Rights Reserved.