Page管理机制

news/2024/7/23 9:29:48 标签: mysql

Page页分类

Buffer Pool 的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率

  • Page根据状态可以分为三种类型:
    在这里插入图片描述
    - free page : 空闲page,未被使用
    - clean page:被使用page,数据没有被修改过
    - dirty page:脏页,被使用page,数据被修改过,页中数据和磁盘的数据产生了不一致

Page页如何管理

针对上面所说的三种page类型,InnoDB通过三种链表结构来维护和管理

  1. free list:表示空闲缓冲区,管理free page

    • Buffer Pool的初始化过程中,是先向操作系统申请连续的内存空间,然后把它划分成若干个【控制块&缓冲页】的键值对。
    • free链表是把所有空闲的缓冲页对应的控制块作为一个个的节点放到一个链表中,这个链表便称之为free链表
    • 基节点: free链表中只有一个基节点是不记录缓存页信息(单独申请空间),它里面就存放了free链表的头节点的地址,尾节点的地址,还有free链表里当前有多少个节点
      在这里插入图片描述
      磁盘加载页的流程:
      • 从free链表中取出一个空闲的控制块(对应缓冲页)
      • 把该缓冲页对应的控制块的信息填上(例如:页所在的表空间、页号之类的信息)
      • 把该缓冲页对应的free链表节点(即:控制块)从链表中移除。表示该缓冲页已经被使用了
    1. flush list:表示需要刷新到磁盘的缓冲区,管理dirty page,内部page按修改时间排序

      • InnoDB引擎为了提高处理效率,在每次修改缓冲页后,并不是立刻把修改刷新到磁盘上,而是在未来的某个时间点进行刷新操作. 所以需要使用到flush链表存储脏页,凡是被修改过的缓冲页对应的控制块都会作为节点加入到flush链表.
      • flush链表的结构与free链表的结构相似
        在这里插入图片描述
        注: 脏页即存在于flush链表,也在LRU链表中,但是两种互不影响,LRU链表负责管理page的可用性和释放,而flush链表负责管理脏页的刷盘操作
    2. lru list:表示正在使用的缓冲区,管理clean page和dirty page,缓冲区以midpoint为基点,前面链表称为new列表区,存放经常访问的数据,占63%;后面的链表称为old列表区,存放使用较少数据,占37%
      普通LRU算法
      LRU = Least Recently Used(最近最少使用): 就是末尾淘汰法,新数据从链表头部加入,释放空间时从末尾淘汰
      在这里插入图片描述

      • 当要访问某个页时,如果不在Buffer Pool,需要把该页加载到缓冲池,并且把该缓冲页对应的控制
        块作为节点添加到LRU链表的头部。
      • 当要访问某个页时,如果在Buffer Pool中,则直接把该页对应的控制块移动到LRU链表的头部
      • 当需要释放空间时,从最末尾淘汰

      普通LRU链表的优缺点

      • 优点:所有最近使用的数据都在链表表头,最近未使用的数据都在链表表尾,保证热数据能最快被获取到。
      • 缺点
        • 如果发生全表扫描(比如:没有建立合适的索引 or 查询时使用select * 等),则有很大可能将真正的热数据淘汰掉
        • 由于MySQL中存在预读机制,很多预读的页都会被放到LRU链表的表头。如果这些预读的页都没有用到的话,这样,会导致很多尾部的缓冲页很快就会被淘汰。
          在这里插入图片描述

      改进型LRU算法
      改性LRU:链表分为new和old两个部分,加入元素时并不是从表头插入,而是从中间midpoint位置插入(就是说从磁盘中新读出的数据会放在冷数据区的头部),如果数据很快被访问,那么page就会向new列表头部移动,如果数据没有被访问,会逐步向old尾部移动,等待淘汰
      在这里插入图片描述
      冷数据区的数据页什么时候会被转到到热数据区呢?

      • 如果该数据页在LRU链表中存在时间超过1s,就将其移动到链表头部 ( 链表指的是整个LRU链表)
      • 如果该数据页在LRU链表中存在的时间短于1s,其位置不变(由于全表扫描有一个特点,就是它对某个页的频繁访问总耗时会很短)
      • 1s这个时间是由参数 innodb_old_blocks_time 控制的

http://www.niftyadmin.cn/n/275593.html

相关文章

【Java基础教程】初识Java

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 **文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用&a…

Packet Tracer - 配置和验证小型网络

Packet Tracer - 配置和验证小型网络 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.10.10.1 255.255.255.0 不适用 G0/1 10.10.20.1 255.255.255.0 不适用 SW1 VLAN1 10.10.10.2 255.255.255.0 10.10.10.1 SW2 VLAN1 10.10.20.2 255.25…

anaconda在新的conda环境创建与打开jupyter notebook,在新的文件目录下打开jupyter notebook(有视频教学)

目录 视频链接如下: anaconda 1.创建新的conda环境; 2.在新的conda环境打开jupyter notebook; 3.在新的文件目录下打开jupyter notebook; 详细步骤: 视频链接如下: 本文也是根据该视频的教学学习做的…

【逻辑位移和算数位移】

<< 运算符 && >> 运算符 正数位移 当 x>>n 中 x 为正数时&#xff0c;会将x的所有位右移x位&#xff0c;同时左边高位补0 显而易见&#xff0c;运算结束后&#xff0c;值为1 。 可知右移n位&#xff0c;结果就是 x / 2^n&#xff1a;7 / 2 ^2 1;…

【VScode】的 安装--配置--使用(中文插件下载不了怎么办?)

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : VScode &#x1f606;今日分享 : ”兰因絮果“是世间定律吗&#xff1f; 一段美好爱情开始时你侬我侬、缠缠绵绵&#xff0c;最后却以相看两厌结尾&#xff0c;让人唏嘘。清代词人纳兰容若于是咏出「人生若只如初见&#xff…

Golang每日一练(leetDay0047)

目录 138. 复制带随机指针的链表 Copy List with Random-pointer &#x1f31f;&#x1f31f; 139. 单词拆分 Word Break &#x1f31f;&#x1f31f; 140. 单词拆分 II Word Break II &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &…

网络基础:socket套接字

文章目录 1. 前导知识1.1 源MAC地址和目的MAC地址1.2 源IP地址和目的IP地址1.3 MAC地址和IP地址的配合1.4 源端口号和目的端口号1.5 Socket1.6 UCP协议和TCP协议1.7 网络字节序高低位高低地址大端和小端网络字节序常用转换函数 2. socket 网络编程2.1 socket 常见接口创建套接字…

fork()创建进程原理

目录 一、写时复制技术写时复制的优点&#xff1a;vfork()和fork() 二、fork()原理初步再理解下页表与多进程在内存中的图像创建进程和创建线程的区别 三、fork()的具体过程 一、写时复制技术 fork()生成子进程时&#xff0c;只是把虚拟地址拷贝给子进程&#xff0c;也就是父进…