• 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可以点赞让更多人看到它。
  • 相关阅读:
    HDU 6076
    HDU 6069
    ZOJ
    HDU
    斜率优化dp
    UVA 11752 The Super Powers
    poj 3761 bubble sort (排列组合)
    UVA 11174 Stand in a Line
    Caffe初学者第二部:Ubuntu16.04上安装caffe(CPU)+Matlab2014a+Opencv3的详细过程 (亲测成功, 20180529更新)
    Caffe初学者第一部:Ubuntu14.04上安装caffe(CPU)+Python的详细过程 (亲测成功, 20180524更新)
  • 原文地址:https://www.cnblogs.com/HappyTeemo/p/15517369.html
Copyright © 2020-2023  润新知