Mysql缓冲池中的lruList和lru算法
缓冲池:优化两种运行速度差距很大的介质之间交互的方法,例如在计算机中cpu比主内存的运行速度快的多,为了消除这种差距,就使用了cache的方式; 主要思想:cpu在读数据时,首先会查询是否存在于缓存中,如果存在直接取出数据,如果不存在就去主内存中查找,找到顺便写回到缓存中, 写数据时,cpu会把数据直接写入到缓存。而缓存会在特定时间把需要写回主内存的数据一次性写入,这样提高了资源的利用率。有点类似于在生活中把一些东西集中起来处理的方式(例如在装载大量货物时,选择载重汽车来提高运输效率)
mysql缓冲池
mysql为了提高与磁盘的交互性,也创建了类似的缓冲池概念,而且mysql从磁盘调取数据的单位是页,一页=16KB,
mysql缓冲池 从磁盘中调取数据页不能是无穷无尽的,因为太多的页占满mysql的内存空间,这时就需要一种调度算法来负责管理页面的调取和抛弃,而mysql选择的加强版的lru算法 lru(Least Recently Used)最近最久未使用算法:这种算法的淘汰机制就是在队列已经达到满的时候,会优先淘汰掉最近最久未使用的元素(这种算法一般存在于队列的末尾)。 lru工作流程:读取元素的时候会元素移动到队列的头部,在删除元素的时候总是在队列的尾部删除元素,添加元素的时候会添加到队列的头部
mysql lru
mysql在原来的lru的基础上进行了一部分改造,使得它更适合应用于其他的极端场景,具体就是在原来的lru列表中加入了midpoint位置,虽然新访问的页面并不是直接添加到队列的头部,而是放入midpoint的位置,在默认的配置下,该位置在lru列表的5/8处。
为什么不采用普通的lru列表
因为普通的lru列表中,某些sql操作可能会使缓冲池中的页被刷新出,从而影响缓冲池的效率。常见的这些操作就是索引或者数据的扫描操作,这类操作需要访问表中的许多页,甚至是全部的页,而这些页通常来说又仅仅在这次操作中需要,并不是热点数据,如果被放在首部,可能会导致热点数据被清除出列表。
|