(1)基于冷热数据分离的思想设计LRU链表
真正MySQL在设计LRU链表的时候,采取的实际上是冷热数据分离的思想,之前一系列的问题,说白了就是所有缓存页都混在一个LRU链表里,才导致的。所以真正的LRU链表,会被拆分成两部分,一部分是热数据,一部分是冷数据,这个冷热数据的比例是由 innodb_old_blocks_pct 参数控制的,默认是37,冷数据占比37%;
(2)数据第一次被加载到缓存时存放位置?
LRU链表按照一定的比例被拆分成了冷热两块区域,那么运行期间冷热两个区域是如何使用的?
首先数据第一次被缓存时,这个时候缓存页会被放到LRU链表的哪个位置呢?实际上这个时候,缓存页会被放到冷数据区域的链表头部
(3)冷数据区域的缓存页何时被加载到热数据区域?
第一次被加载了数据的缓存页,都会不停的移动冷数据区域的链表头部,那么冷数据区域的缓存页肯定是会被使用的,那么冷数据区域的缓存页什么时候放到热数据区域呢?
其实不是访问一次之后就放到热数据区域,MySQL设定了一个参数 innodb_old_blocks_time ,默认是1000 ,即1000毫秒,就是一个数据页被加载到缓存页之后,在1s 之后你访问这个缓存页,它才会被移动到热数据区域的链表头部去。在1s内访问缓存页,此时不会把这个缓存页放入热数据区域的头部的。
问题:
数据页被加载到冷数据区域,1s后再次访问会被放到热数据区域链表的头部,那么LRU链表的冷数据区域存放的都是什么样的缓存页呢?
答:
应该是用一次后没有使用的数据页(正常读取的)和预缓存的数据页(预读)