1.导致lru链表中热数据区被挤到尾部节点的可能原因
由于mysql有预读的机制,会导致不是热数据的预读页会随着缓存页的读取会被放到lru链表的最头部
还有mysql有全量扫描表的可能,也会导致大量本来属于热数据的缓存页会被挤到lru链表的最尾部
预读机制中的值设置
-- innodb_read_ahead_threshold 默认值是56 ,如果顺序的访问一个区内的数据页超过这个数量,就会触发预读机制,将下一个相邻区中的所有数据页都会加载到缓存页中
-- innodb_random_read_ahead
默认值是off 如果buffer pool里缓存了一个区中的13个连续的数据页 那么这个区中的其他数据页也会被加载到缓存页中的
2.所以lru进行了优化,引入了冷热数据分离处理的机制
拆成两部分一部分是热数据区一部分是冷数据区
比例由参数控制 innodb_old_blocks_pct 默认是37 冷数据为37%
第一次加载进来的数据会被放在冷数据的头部
参数 innodb_old_blocks_time 默认值是1000 ,也就是说在1000毫秒之后再次访问这个值,那么这个值就会从冷数据区移到热数据区头部
3.热数据区优化
由于热数据经常被访问会导致热数据前部分数据的节点会经常移动,所以热数据区的前1/4被访问之后是不会发生节点移动的。只有在访问热数据区的后3/4才会将数据移到链表头部