MySQL BufferPool 原理
2021-07-12 10:24:40   0  举报             
     
         
 针对MySQL的BufferPool核心原理做了一个汇总分析
    作者其他创作
 大纲/内容
 元数据
    一行数据
  extent 数据区(包含64个数据页)
  结束节点
  找到空闲缓存页后将数据页加载到对应缓存页并从Free链表中删除该节点
  LRU链表
  开始节点
  缓存页
  先从哈希表检查数据有没有在缓存页
  数据组包含了256个extent数据区
  表空间 磁盘文件(.idb)包含了多个数据组
  key=表空间号+数据页号value=缓存页地址
  数据页缓存哈希表
  读写数据
  预读的缓存页放入冷数据区当被读取到时放入冷数据头部当被修改时,放入热数据区
  Free 双向链表
  缓存页(16k)
  定时任务
  命中直接操作缓存页
  Flush 双向链表
  Change Buffer
  Chunk(128M)
  定期merge
  数据不在缓存页时先把修改数据写到change buffer中,等下次查询从磁盘加载数据页的时候再merge
  如果数据在buf缓存页中,直接修改
  将BufferPool划分为多个Chunk,可以动态的调整大小,也避免了多线程下的加锁性能问题
  从Free链表查找空闲缓存页
  基础节点count=3
  Flush链表记录的脏页的缓存页MySQL修改缓存页后,会在Flush链表里添加对应节点,刷盘的时候直接从Flush链表找到脏页刷盘即可
  数据页(16k)
  LRU 双向链表
  冷数据区
  未命中从磁盘加载到缓存页
  Buffer Pool(2G)
  写数据
  定时将Flush链表的缓存页和LRU的冷数据尾部节点刷入磁盘
  热数据区
  Flush链表
  Free链表
   
 
 
 
 
  0 条评论
 下一页
  
   
   
   
  
  
  
  
  
  
  
  
 