MySQL怎么缓解读的压力的(---buffer|MySQL怎么缓解读的压力的?---buffer pool)
每当我们想要缓解读,一般会想到什么?
预读取,缓存缓存 缓存,其实就是将高频访问的数据放到内存里面,减少读盘的次数。
为了提高内存的利用率,MySQL还建立了缓存池,也就是buffer pool,存储最热的数据页和索引页。
预读取(read-ahead) 从Linux的文件系统我们就知道,计算机的读取是按页来的。那么,我们是不是可以将下一页提前取出来,反正是一次磁盘IO。
LRU(Least recently used) 提到缓存和预读取,LRU是跑不了的,简单地说,就是将池子里面待的最久的内存淘汰掉,放入新的数据。
- 里面是个链表结构,首部新增,尾部淘汰。
- 访问的时候,如果在池子里,就移动到首部,如果不在,就放到首部并把尾部淘汰。
文章图片
那么,缺点有没有?
预读失效:你放了我不读。不就浪费了内存么。优化
凡是要区别对待,就将他们隔离开来。我们想要的就是真正读取的数据缓存起来,预读的数据级别低一点,稍微缓存一下就好了。
那么,很简单,把内存池分段,一段存真正读的,一段存预读的。
这就是新生代(new sublist)和老生代(old sublist),新的尾就是老的头。
逻辑不变,但是可以配置长度,比如新的站70%,老的占30%,老的由于比较短,就会更快淘汰。
【MySQL怎么缓解读的压力的(---buffer|MySQL怎么缓解读的压力的?---buffer pool)】那么, 完美了么?
缓存池污染:如果SQL需要扫描大量的行,则可能将所有数据替换出去,这样就等于缓存直接失效了。优化2.0
凡是要防止区别对待的事务强行混合,就添加阈值,让低一级的过不来。将所有的数据都先丢到老的里面,停留时间大于T,才能进入新生代,这样老的就在不断被刷新,而真正需要的会逐渐进入新生代。
相关参数
- 缓存池大小
- 老生代比例
- 老生代停留时间
- 如果有不对的地方欢迎指正。
- 如果有不理解的地方欢迎指出我来加栗子。
- 如果感觉OK可以点赞让更多人看到它。
推荐阅读
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 七年之痒之后
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 开花店的前景怎么样()
- 私通和背叛,他怎么看(——晨读小记)
- 有句话忍很久了,女生要求买房怎么就物质了()
- 在线版的迅捷思维导图怎么操作()
- 不废话,代码实践带你掌握|不废话,代码实践带你掌握 强缓存、协商缓存!
- 昨晚做春梦了吗(教给你怎么做最厉害的!梦里还有维多利亚的天使)
- 年轻人对未来迷茫时该怎么办()