美文网首页
innerdb buffer pool 结构

innerdb buffer pool 结构

作者: 放开那个BUG | 来源:发表于2021-07-07 00:06 被阅读0次

    1、前言

    innerdb 为啥要有个 buffer pool 呢?因为 mysql 的数据页是存储在磁盘上的,如果每次查询都从磁盘上查询数据,想必速度慢的一比,所以有一个 buffer pool 缓存存储查询的数据页。

    buffer pool 主要由控制块和数据页组成,控制块记录了数据页的地址、页号等一些元数据信息,控制块由链表相互链接,而控制块指向相应的页面。

    2、free 链表

    所有空闲的缓存页对应的控制块放到一个链表中,这个链表叫 free 链表。所以每次从磁盘加载一个页到内存中时,会从 free 链表中选取一块空闲的控制块对应的页面,然后把数据页放入其中,再将控制块从 free 链表中移除。

    3、flush 链表

    如果 buffer pool 中的数据页被修改,那么它与磁盘中的数据就会不同,此时内存中的数据页成为”脏页“。“脏页”肯定不会立即刷到磁盘,而是需要一定的策略来刷,所以需要 flush 链表来管理这些“脏页”。flush 链表上链接着 buffer pool 中所有的“脏页”,等到一定的时机再刷盘。

    4、lru 链表

    那么磁盘中已经使用的数据页由谁记录呢?所以 lru 链表呼之欲出了。当然传统的 lru 面临着修改过于频繁的问题,所以 innerdb 将 lru 进行了优化,将 lru 分为了热数据区、冷数据区。冷数据区的第二次访问时间 - 第一次访问时间 > 1s 才会被移动到热数据区。

    5、总体结构

    如果说白色是未使用,黄色 + 深色是已经使用,深色表示已经修改
    它们总体结构如下图所示:


    buffer pool 中的链表

    首先,我不是很知道 buffer pool 的数据结构是什么,所以以上说的都是逻辑概念,按照逻辑概念理解即可。

    相关文章

      网友评论

          本文标题:innerdb buffer pool 结构

          本文链接:https://www.haomeiwen.com/subject/scvmultx.html