说下 MySQL 的 Buffer Pool 的工作原理?

#每天一道面试题# 39

#悟空拧螺丝# 2021-08-20

MySQL 先把磁盘里面的数据加载到 Buffer Pool 中,增删改都是基于 Buffer Pool 里面的内存数据进行操作的,内存的效率比 IO 高很多倍。改了内存数据后,再定期刷新到磁盘。

Buffer Pool 有三大双端链表:free、flush、lru 链表。

  • free 主要指向空闲缓存页。
  • flush 指向已修改的缓存页。
  • lru 指向被修改的缓存页,并根据最近最少使用的规则进行排序。

流程: 一边不停地加载数据到缓存页里去,一边不停地查询和修改缓存数据,然后free链表中的缓存页不停地减少↓,flush链表中的缓存页不停地增加↑,lru链表中的缓存页不停的在增加↑和移动←→。 另外一边,后台线程不停的把 lru 链表的冷数据区域的缓存页以及 flush 链表的缓存页,刷入磁盘中来清空缓存 页,然后flush链表和lru链表中的缓存页在减少↓,free链表中的缓存页在增加↑。