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去写数据