MySQL怎么缓解读压力

2021-11-07 From 博客园 By 快乐的提千万
<p> 每当我们想要缓解读,一般会想到什么?预读取,缓存p>

缓存

<p> 缓存,其实就是将高频访问数据放到内存里面,减少读盘的次数。 p> <p> 为了提高内存的利用率,MySQL还建立了缓存池,也就是buffer pool,存储最热的数据页和索引页。 p>

预读取(read-ahead)

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

LRU(Least recently used)

<p> 提到缓存和预读取,LRU是跑不了的,简单地说,就是将池子里面待的最久的内存淘汰掉,放入新的数据p>
  • 里面是个链表结构,首部新增,尾部淘汰。
  • 访问的时候,如果在池子里,就移动到首部,如果不在,就放到首部并把尾部淘汰。
<p> image.png p> <p> 那么,缺点有没有?预读失效:你放了我不读。不就浪费内存么。 p>

优化

<p> 凡是要区别对待,就将他们隔离开来。 p>
<p> 我们想要的就是真正读取的数据缓存起来,预读的数据级别低一点,稍微缓存一下就好了。 p> <p> 那么,很简单,把内存池分段,一段存真正读的,一段存预读的。 p> <p> 这就是新生代(new sublist)和老生代(old sublist),新的尾就是老的头。 p> <p> 逻辑不变,但是可以配置长度,比如新的站70%,老的占30%,老的由于比较短,就会更快淘汰。 p> <p> 那么, 完美了么? p>
<p> 缓存池污染:如果SQL需要扫描大量的行,则可能将所有数据替换出去,这样就等于缓存直接失效了。 p>

优化2.0

<p> 凡是要防止区别对待的事务强行混合,就添加阈值,让低一级的过不来。 p>
<p> 将所有的数据都先丢到老的里面,停留时间大于T,才能进入新生代,这样老的就在不断被刷新,而真正需要的会逐渐进入新生代。 p>

相关参数

结语

  • 如果有不对的地方欢迎指正。
  • 如果有不理解的地方欢迎指出我来加栗子。
  • 如果感觉OK可以点赞让更多人看到它。

本文来源:博客园,转载请注明出处!

来源地址:https://www.cnblogs.com/HappyTeemo/p/15517369.html

发表感想

© 2016 - 2022 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号