蓝盟IT外包,详细了解InnoDB存储器结构及其原理

发布者:上海IT外包来源:http://www.lanmon.net点击数:1344

蓝盟IT小贴士,来喽!
InnoDB存储器结构
InnoDB内存的两个主要区域分别是缓冲池和日志缓冲区,这里的日志缓冲区目前用于缓存重做日志。 Buffer  Pool在MySQL或InnoDB中非常重要,是核心的一部分,在主存中。 因此,对数据的访问效率高,可以暂时理解为Redis之类的内存数据库。 因为,我们当然更新和添加它是不同的,但只有这样才能更容易理解。
缓冲池
瘦主机的内存80%通常需要分配给缓冲池。 因为Buffer  Pool越大,可以缓存的数据就越多,内存中会发生更多的操作,从而提高效率。
由于其保存的数据类型和数据量非常大,Buffer  Pool必须以某种结构保存,并进行了某种处理。 否则,除了遍历所有数据之外没有其他快捷方式。 这样低效的操作肯定不能支持MySQL的高性能。
因此,Buffer  Pool分为很多页,这在前一篇文章中也有论述,所以在此省略说明。 虽然每页可以存储很多数据,但正如前面所述,InnoDB一定对数据进行了某种操作。
InnoDB使用链表来组织存储在页和页中的数据,并在页和页之间形成双向链表。 这样可以轻松地从当前页跳转到下一页。 此外,还可以使用最近使用的(LRU  )算法处置不经常使用的数据。
此外,各页的数据也通过单向链表进行了链接。 由于这些数据分散在Buffer  Pool中,所以单向链表连接了这些分散的存储器。
详细了解InnoDB存储器结构及其原理
谈了MySQL和InnoDB的日志,写了两次。 总的来说是入门级的介绍。 本文详细介绍了InnoDB的内存结构。
作者: SH的全栈笔记本来源: SH的全栈笔记本|2021-04-13 09:07集合共享
以前写过一篇文章叫《简单理解InnoDB的原理》,现在回头看,其实只包括缓冲池、重做日志缓冲器、插入缓冲器、自适应哈希索引等我们还讨论了MySQL和InnoDB的日志和两次写入,但大体上是入门级的介绍。 本文详细介绍了InnoDB的内存结构。
InnoDB存储器结构
其概略结构如下图所示。
InnoDB内存的两个主要区域分别是缓冲池和日志缓冲区,这里的日志缓冲区目前用于缓存重做日志。 Buffer  Pool在MySQL或InnoDB中非常重要,是核心的一部分,在主存中。 因此,对数据的访问效率高,可以暂时理解为Redis之类的内存数据库。 因为,我们当然更新和添加它是不同的,但只有这样才能更容易理解。
缓冲池
瘦主机的内存80%通常需要分配给缓冲池。 因为Buffer  Pool越大,可以缓存的数据就越多,内存中会发生更多的操作,从而提高效率。
由于其保存的数据类型和数据量非常大,Buffer  Pool必须以某种结构保存,并进行了某种处理。 否则,除了遍历所有数据之外没有其他快捷方式。 这样低效的操作肯定不能支持MySQL的高性能。
因此,Buffer  Pool分为很多页,这在前一篇文章中也有论述,所以在此省略说明。 虽然每页可以存储很多数据,但正如前面所述,InnoDB一定对数据进行了某种操作。
InnoDB使用链表来组织存储在页和页中的数据,并在页和页之间形成双向链表。 这样可以轻松地从当前页跳转到下一页。 此外,还可以使用最近使用的(LRU  )算法处置不经常使用的数据。
此外,各页的数据也通过单向链表进行了链接。 由于这些数据分散在Buffer  Pool中,所以单向链表连接了这些分散的存储器。
日志缓冲器
Log  Buffer用于存储将笔刷到磁盘文件中的日志,如重做日志。 此区域也是InnoDB存储器的重要组成部分。 日志缓冲器的默认值为16M,如果需要调整,可以通过配置参数innodb_log_buffer_size进行调整。
如果Log  Buffer很大,则可以存储更多的重做日志,因此不需要在提交事务之前将重做日志刷到磁盘上,只需要将其丢弃到Log  Buffer中。 因此,较大的日志缓冲器可以更好地支持较大的事务的执行。 同样,如果事务大幅更新、插入或删除行,适当增大日志缓冲器的大小也可以有效减少磁盘I/O的一部分。可以通过innodb_flush_log_at_trx_commit参数来确定将日志缓冲器中的数据刷新到磁盘的频率。
缓冲池的LRU算法
了解InnoDB的内存结构后,让我们仔细看看Buffer  Pool的LRU算法如何使最近未使用过的数据过期。
原生LRU
首先,我们要明确这里的LRU算法与我们以前的LRU算法有一定的差异。 为什么这么说呢,因为在实际的生产环境中存在全表扫描,数据量大的话,可以替换掉Buffer  Pool中保存的所有热点数据,在那个时间段,MySQL的性能有可能会断崖式下跌。
在这种情况下,MySQL中有缓冲池污染这个专用名词。 因此,MySQL对LRU算法进行了优化。
优化的LRU
优化后的链表分为两部分,分别占缓冲池的3/4和1/4,即新辅助表和old辅助表。
链表的前3/4,也就是New  Sublist中存储了访问频率较高的页面,之后的1/4,也就是Old  Sublist中存储了反问不太频繁的页面。 如果后续Buffer  Pool的剩余空间不足或添加了新页面,Old  Sublist中的数据将被删除。

一旦了解了链表的整体结构和结构,我们就从新页面被添加到链表开始,重复一遍整个过程。 首先,当新页插入到Buffer  Pool时,它将插入到链表的New  Sublist和Old  Sublist的交叉点,即MidPoint。

文/上海蓝盟  IT外包专家

IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部