暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL InnoDB体系结构之--Buffer状态及其链表结构

MySQLDBA运维零基础自学 2021-04-13
686

innodb由内存结构,线程,硬盘结构构成

page是Innodb磁盘I/O的最小单位,每个页的默认大小是16KB,数据是存放在page中的,那么对应到内存到内存中就是一个个的buffer,每个buffer有又分为三种状态


free buffer :此状态下的buffer从未被使用,在实际中,数据库很繁忙的情况下,free buffer的状态基本不存在的。


clean buffer:内存中的buffer里面的数据和磁盘page的数据一致。


dirty buffer:内存中新写入的数据还没有刷新到磁盘,跟磁盘中数据不一致。


管理buffer用到3个链表

  • FREE链表

FREE链表里面存储了没有被使用的buffer块,当数据缓存到内存中的时候,就从FREE链表优先获取空块来缓存数据,当free链表里面的数据被使用完的时候,如果在需要申请空间,那么就需要去根据LRU淘汰已经使用过的数据页。


  • LRU链表

缓存数据的链表,利用LRU算法来淘汰旧的数据,保证我们的内存中始终是经常被访问到的数据。
LRU:最近最少使用算法,最近不经常被使用的数据会被放到链表的一端(冷数据 冷端),经常被访问的数据被放到另一端(热数据 热端)

数据库的缓冲池都是通过LRU(Latest Recent Used 最近最少使用)来进行管理,即最频繁使用的页在LRU链表的前端,而最少使用的页在LRU
链表的尾端。当然缓冲池不能存放取到的页的时候,首先将LRU链表中释放尾端的页。


LRU链表存放脏块:已经被修改(内存),但是没有落盘的数据。


innodb的LRU算法做了优化,在链表中加入了mid_point位置,最新读取的页面,并不是直接放入到前端而是放入到中间,这样可以防止热
块被新读取的大量数据顶替出LRU链表(索引和数据的扫描操作,这时候如果放入首部的话,很可能不是热块,而要使用的热块会被冲出)。

  • LRU链表的分段

Young list 存储那些高频使用的缓存数据(默认占整个BUFFER的5/8)
Old list 存储那些低频使用的数据(默认占整个BUFFER的3/8)
innodb都会把它加入到Younglist的头部。但如果块数据是被read-ahead机制访问,它不会马上被加载到Young list。当长期不使用的数据块被挤到了Old list的尾巴,就会被系统回收


innodb_max_dirty_pages_pct
默认75% LRU内的脏块如果超过75%,强制性的刷脏。


innodb_old_blocks_pct
确定modpoint位置, 默认37,modpoint指新读取到的⻚放入LRU(最近最少使⽤算法) 列表中的位置


innodb_old_blocks_time
表示页读入mid位置后需要等待多久才会被加入到LRU列表的热端


  • FLUSH链表



脏块被刷入FLUSH链表,然后会在一段时间内进行落盘,脏块在LRU链表里面和FLUSH里面都存在,LRU链表管理数据块的可用性,FLUSH用于数据块的写入磁盘。




最后修改时间:2021-04-14 09:15:31
文章转载自MySQLDBA运维零基础自学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论