传统LRU对缓冲页是如何管理的
发布时间:2023-06-29 11:33:44 所属栏目:MySql教程 来源:
导读:利用LRU算法对最近最少使用的缓冲页进行管理,形成对应的链表,方便用于淘汰。
当访问一个页【即最近访问】
该页在缓冲池中,将对应控制块移至LRU链表头部
该页不在缓冲池中,淘汰尾部最近最少使用的页,从磁盘
当访问一个页【即最近访问】
该页在缓冲池中,将对应控制块移至LRU链表头部
该页不在缓冲池中,淘汰尾部最近最少使用的页,从磁盘
利用LRU算法对最近最少使用的缓冲页进行管理,形成对应的链表,方便用于淘汰。 当访问一个页【即最近访问】 该页在缓冲池中,将对应控制块移至LRU链表头部 该页不在缓冲池中,淘汰尾部最近最少使用的页,从磁盘中加载进来该页并放在LRU链表头部 那么为什么InnoDB不使用这么直观的LRU算法呢?原因如下: 预读失效预读到缓冲池中的页都会放到LRU链表的头部,但其中很多页可能并不会被读取。 缓冲池污染很多使用频率较低的页加载到缓冲池中,会把使用频率较高的页从缓冲池中淘汰掉。 基于上述缺点,优化后的具体方法将传统LRU链表划分为两部分:热数据区域【年轻区】&冷数据区域【老年区】 热数据区域【年轻区】:使用频率高的缓冲页 冷数据区域【老年区】:使用频率低的区域 改进后的LRU如何更好的解决预读失效问题呢? 某个页在初次加载到缓冲池中时,先淘汰掉冷数据区域尾部的控制块(即其对应的页淘汰掉),然后新页对应的控制块会先放到冷数据区域的头部。 若后续该页不被进行访问就会慢慢从冷数据区域中被淘汰掉,总体不会影响热数据区域访问频繁的缓冲页。 改进后的LRU如何更好的解决缓冲池污染问题呢? 先说结论,并没有很好的优化这个问题,原因如下【以全表扫描为例】: 某个初次访问的页同样会放到冷数据区域的头部,但后续访问又会将其放到热数据区域的头部,这样同样会把访问频率较高的页给挤掉。 那么到底该如何解决缓冲池污染问题呢? 缓冲池引入了冷数据区域时间窗口机制,即只有后续访问该页与第一访问该页的时间间隔大于规定的窗口值,就会将该页从冷数据区域移到热数据区域的头部。小于规定的窗口值,就不会进行移动操作。 同样,窗口值可通过innodb_old_blocks_time参数【单位ms】来设置,默认1000ms,而1s会筛选掉大部分像全表扫描这样的操作。比如在一次全表扫描过程中,多次访问一个页面的时间间隔不会超过1s。 缓冲池VS查询缓存 缓冲池和查询缓存是一个东西吗?→不是 缓冲池会尽量将经常使用的数据保存起来,在MySQL进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。 查询缓存是提前把查询结果缓存起来,这样下次不需要执行就可以直接拿到结果。需要说明的是,在MySQL中的查询缓存,不是缓存查询计划,而是查询对应的结果。命中条件苛刻,而且只要数据表发生变化,查询缓存就会失效,因此命中率低。 到此,关于“MySQL中的数据库缓冲池怎么管理”的学习就结束了,希望能够解决大家的疑惑。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |