• MySQL怎么缓解读的压力的?---buffer pool


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

    预读取,缓存

    缓存

    缓存,其实就是将高频访问的数据放到内存里面,减少读盘的次数。

    为了提高内存的利用率,MySQL还建立了缓存池,也就是buffer pool,存储最热的数据页和索引页。

    预读取(read-ahead)

    从Linux的文件系统我们就知道,计算机的读取是按页来的。那么,我们是不是可以将下一页提前取出来,反正是一次磁盘IO。

    LRU(Least recently used)

    提到缓存和预读取,LRU是跑不了的,简单地说,就是将池子里面待的最久的内存淘汰掉,放入新的数据

    • 里面是个链表结构,首部新增,尾部淘汰。
    • 访问的时候,如果在池子里,就移动到首部,如果不在,就放到首部并把尾部淘汰。

    image.png

    那么,缺点有没有?

    预读失效:你放了我不读。不就浪费了内存么。

    优化

    凡是要区别对待,就将他们隔离开来。

    我们想要的就是真正读取的数据缓存起来,预读的数据级别低一点,稍微缓存一下就好了。

    那么,很简单,把内存池分段,一段存真正读的,一段存预读的。

    这就是新生代(new sublist)和老生代(old sublist),新的尾就是老的头。

    逻辑不变,但是可以配置长度,比如新的站70%,老的占30%,老的由于比较短,就会更快淘汰。

    那么, 完美了么?

    缓存池污染:如果SQL需要扫描大量的行,则可能将所有数据替换出去,这样就等于缓存直接失效了。

    优化2.0

    凡是要防止区别对待的事务强行混合,就添加阈值,让低一级的过不来。

    将所有的数据都先丢到老的里面,停留时间大于T,才能进入新生代,这样老的就在不断被刷新,而真正需要的会逐渐进入新生代。

    相关参数

    • 缓存池大小
    • 老生代比例
    • 老生代停留时间

    结语

    • 如果有不对的地方欢迎指正。
    • 如果有不理解的地方欢迎指出我来加栗子。
    • 如果感觉OK可以点赞让更多人看到它。
  • 相关阅读:
    斐波那契(通项公式)
    数论--欧几里得定理(求最大公约数)
    5790 素数序数(筛素数版)
    数论--筛法求素数
    2491 玉蟾宫
    闭包详解
    ASP.NET 页生命周期概述1
    IIS 7.0 的 ASP.NET 应用程序生命周期概述
    IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述
    WeUI logo专为微信设计的 UI 库 WeUI
  • 原文地址:https://www.cnblogs.com/HappyTeemo/p/15517369.html
Copyright © 2020-2023  润新知