MySQL怎么缓解读的压力的(---buffer|MySQL怎么缓解读的压力的?---buffer pool)

每当我们想要缓解读,一般会想到什么?

预读取,缓存
缓存 缓存,其实就是将高频访问的数据放到内存里面,减少读盘的次数。
为了提高内存的利用率,MySQL还建立了缓存池,也就是buffer pool,存储最热的数据页和索引页。
预读取(read-ahead) 从Linux的文件系统我们就知道,计算机的读取是按页来的。那么,我们是不是可以将下一页提前取出来,反正是一次磁盘IO。
LRU(Least recently used) 提到缓存和预读取,LRU是跑不了的,简单地说,就是将池子里面待的最久的内存淘汰掉,放入新的数据。
  • 里面是个链表结构,首部新增,尾部淘汰。
  • 访问的时候,如果在池子里,就移动到首部,如果不在,就放到首部并把尾部淘汰。
MySQL怎么缓解读的压力的(---buffer|MySQL怎么缓解读的压力的?---buffer pool)
文章图片

那么,缺点有没有?
预读失效:你放了我不读。不就浪费了内存么。
优化
凡是要区别对待,就将他们隔离开来。
我们想要的就是真正读取的数据缓存起来,预读的数据级别低一点,稍微缓存一下就好了。
那么,很简单,把内存池分段,一段存真正读的,一段存预读的。
这就是新生代(new sublist)和老生代(old sublist),新的尾就是老的头。
逻辑不变,但是可以配置长度,比如新的站70%,老的占30%,老的由于比较短,就会更快淘汰。
【MySQL怎么缓解读的压力的(---buffer|MySQL怎么缓解读的压力的?---buffer pool)】那么, 完美了么?
缓存池污染:如果SQL需要扫描大量的行,则可能将所有数据替换出去,这样就等于缓存直接失效了。
优化2.0
凡是要防止区别对待的事务强行混合,就添加阈值,让低一级的过不来。
将所有的数据都先丢到老的里面,停留时间大于T,才能进入新生代,这样老的就在不断被刷新,而真正需要的会逐渐进入新生代。
相关参数
  • 缓存池大小
  • 老生代比例
  • 老生代停留时间
结语
  • 如果有不对的地方欢迎指正。
  • 如果有不理解的地方欢迎指出我来加栗子。
  • 如果感觉OK可以点赞让更多人看到它。

    推荐阅读