介绍
缓冲池是InnoDB在访问表和索引数据时缓存的主内存区域。缓冲池允许直接从内存访问频繁使用的数据,这加快了处理速度。在专用服务器上,通常会将多达80%的物理内存分配给缓冲池。
为了提高大容量读操作的效率,缓冲池被划分为可能包含多行的页面。为了提高缓存管理的效率,缓冲池被实现为页面链表;很少使用的数据使用最近最少使用(LRU)算法的变体从缓存中老化。
了解如何利用缓冲池将频繁访问的数据保存在内存中是MySQL调优的一个重要方面
问题
LRU算法是通用的淘汰算法,但是这个算法在这个场景有一个问题,因为预读的原因,很有可能从存储中读到内存数据中,在内存有限的情况,可能会导致常用的内存页会被淘汰掉。
解决方案
1.借用java 中堆内存的思路,把内存分成young和old两块,从磁盘中读到的数据先放到old区,只有实际访问到这页的数据才加载到young区的head 里,这样old区里老的没访问到的数据逐步会退到tail,最后淘汰掉。
2.如果是全量查询的情况,会导致数据大量的全部查询出来,这时会造成buffer pool 污染,为了解决这个问题,在一的基础上增加了innodb_old_blocks_time 参数,只有数据页在old区,停留超过了这个范围的,才会加载到young区