作者:zhou
mysql版本:5.7
先介绍一下 buffer pool:
在innodb存储引擎中数据访问以page为单位,page也是innodb管理数据库的最小磁盘单位,每个page的默认大小为16KB(可以通过参数innodb_page_size进行调整,在5.7增加了对32KB和64KB的大小支持,在此之前的版本支持4KB,8KB,16KB的大小设定),而buffer_pool是用来管理和缓存这些page的,innodb会把一块连续的内存划分给buffer_pool使用,并把buffer_pool等分为多个buffer_pool_instances(在上篇博客有介绍这个参数)。
buffer_pool是基于LRU算法来实现的,通过LRU算法来保证单独的一个page只会在一个buffer_pool_instances中,这样的划分模式可以提升buffer_pool的并发性能,每个单独的buffer_pool_instances其实都可以说是一个buffer_pool,innodb通过拉取page的方式将数据从文件中读取到buffer_pool里,并通过一个LRU list 来缓存这些page,经常访问的热点page放在在list的前面称之为list young区域,不经常访问的page 放在list的后面称之为list old区域,innodb访问数据时会先从buffer_pool中读取,没找到就会去访问数据文件进行查找,读取到page 并放到list old区域,当buffer_pool没有空闲的page时,会对list中old的page进行淘汰。
innodb 的LRU 算法简介:
innodb对原有的LRU算法进行了改进,LRU 算法的核心就是淘汰最久未使用的数据,在innoDB的实现上,按照5:3的比例把整个LRU list分成了 young 区域(前5/8)和 old 区域(后3/8),扫描的过程中新插入的page,都被先放到list old区域的头部区域,在间隔一秒以上再次访问到该page 就会移到 list young区域,这样的改进可以避免类似于全表扫描的操作对整个list造成过大的影响也保证了young区域的正常查询命中率。
LRU List:
原创文章 3获赞 1访问量 861
关注
私信
展开阅读全文
作者:zhou_2020-03-31