MySQL基础篇--innodb内存逻辑

时间:2022-10-28 07:17:11

FREE链表

FREE链表就是存放没有被使用的数据块的链表,当数据缓存到内存中的时候, 就从FREE链表优先获取空快来缓存数据。如果FREE使用完,就从LRU链表利用LRU算法 淘汰旧的数据。

LRU链表

缓存数据的链表,利用LRU算法来淘汰旧的数据,保证我们的内存中始终是经常被访问到的数据 。

LRU:最近最少使用算法,最近不经常被使用的数据会被放到链表的一端(冷数据 冷端),经常被访问的数据 被放到另一端(热数据 热端)。

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

涉及参数

innodb_max_dirty_pages_pct

脏块写入磁盘,刷脏 innodb_max_dirty_pages_pct 默认75% LRU内的脏块如果超过75%,强制性的刷脏。 如果不确定,使用默认值就可以了。 如果业务有大量数据写入,而且不会频繁的访问或者修改(数据不活跃),可以考虑调低一些。 如果业务数据比较活跃,可以调高一些默认值。

innodb_old_blocks_pct

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

innodb_old_blocks_time

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

FLUSH链表

刷脏链表,脏块被写入硬盘,先载入flush链表,然后由flush链表进行刷脏。

​Innodb buffer pool数据预热

数据库被频繁访问到,热点数据都被加载到内存,提高访问效率,数据库重启, 数据库内热点数据已经消失,需要业务再次反问的时候,再从硬盘调入到内存,在数据库的一段时时间内 访问效率比较低。

innodb_buffer_pool_dump_at_shutdown = 1

在关闭数据库得的时候,持久化热数据到硬盘

innodb_buffer_pool_load_at_startup = 1

在开启数据库的时候,把数据从硬盘直接载入到内存

innodb_buffer_pool_dump_pct = 40

选择热数据关闭数据库持久化到硬盘的百分比 ib_buffer_pool文件,就持久化innodb热数据的文件

innodb_flush_neighbors

刷新邻接页:合并IO请求,减少随机IO 默认是开的, 这个⼀定要开着,充分利⽤顺序IO去写数据