首页 > 数据库 >一看就懂的MySQL的FreeList机制

一看就懂的MySQL的FreeList机制

时间:2022-12-15 13:32:03浏览次数:48  
标签:缓存 Buffer 一看 List Free FreeList MySQL 数据

Hi,大家好!我是白日梦!

今天我要跟你分享的MySQL话题是:“了解InnoDB的FreeList吗?谈谈看!”

本文是MySQL专题的第 7 篇,共110篇。


一、回顾

前面几篇文章白日梦和你分享了,我们从磁盘中读取出来的数据页以缓存页和描述信息的方式组织在Buffer Pool中。

MySQL启动后,BufferPool就会被初始化,在你没有执行任何查询操作之前,BufferPool中的缓存页都是一块块空的内存,未被使用过也没有任何数据保存在里面。

而且你也知道了通过缓冲页的描述信息可以直接且唯一的找到它所指向的缓存页。

那你有没有想过,我们从磁盘里面读取出来的 数据页 应该放到那个缓冲页中去呢?

这个问题就引出了Free List。


二、Free List

其实Free List是Buffer Pool中基于缓存页描述信息 组织起来的双向链表。换言之,Free List中的每一个结点都是缓存页对应的描述信息。并且通过描述信息可以找到指定的缓存页(缓存页)

一看就懂的MySQL的FreeList机制_List

InnoDB设计Free List的初衷就是为了解决上面说的问题。

如果这个缓存页中没有存储任何数据,那么它对应的描述信息就会被维护进Free List中。这时当你想把从磁盘中读取出一个数据页放入缓存页中的话,就得先从Free List中找一个节点(Free List中的所有节点都会指向一个从未被使用过的缓存页),那接着就可以把你读取出来的这个数据页放入到该节点指向的缓存页中。

相应的:当数据页中被放入数据之后。它对应的描述信息块会被从Free List中移出。


三、如何判断数据页有没有在缓存中?

你会不会纳闷MySQL怎么知道刚读取出来的这个数据页有没有在缓存页中呢?

这个功能的实现依托于另一个数据结构:hash table

key = 表空间号+数据页号

value = 缓存页地址

如果存在于hash table中,那就说明该数据页已经存在于Buffer Pool中了,优先使用Buffer Pool中的缓存页。相信你肯定能想到为啥优先使用Buffer Pool中的缓存页吧!首先免去了磁盘的随机IO,其次缓存页中的数据可能是已经被修改了的脏数据。


微信公号


一看就懂的MySQL的FreeList机制_缓存_02



标签:缓存,Buffer,一看,List,Free,FreeList,MySQL,数据
From: https://blog.51cto.com/u_15311508/5939342

相关文章

  • Python爬虫爬取国家统计局2009年到2020年,统计用区划和城乡划分代码(省市区/县三级)并存
    国家统计局->统计标准网址:​​http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/​​流程对统计标准的网站进行分层分级爬取  代码importpymysqlfrombs4importBeaut......
  • 查看mysql当前事务锁并kill
    执行如下SQL,查看当前事务:selectt.trx_mysql_thread_id,t.trx_started,t.trx_state,t.trx_tables_in_use,t.trx_tables_locked,t.trx_rows_locked,t......
  • python2中mysql插入中文的问题
    insert_sql_template="""insertintoap_console_template(`id`,`name`,`type`,`content`,`desc`)values(%s,'%s',%s,'%s','%s')"""forrow_datain......
  • mysql存储过程 便利查询结果集 并 获取结果集数据 插入新表数据
    --建立存储过程之前需要判断该存储过程是否存在,若存在则删除DROPPROCEDUREIFEXISTSinsert_project_unit;--创建存储过程,insert_project_unit为存储过程名CREATE......
  • MYSQL安装
    MYSQL安装一.DBA工作内容及课程体系img二.MySQL课程体系介绍三.DBA的职业素养四.MySQL简介及安装01什么是数据?数据(data)是事实或观察的结果,是对客观事物的逻辑归......
  • 设置MySql事务隔离级别的坑
    结论设置MySql会话级别事务隔离级别时需要先设置当前会话的事务隔离级别,然后再开启事务,否则新开启的事务隔离级别不是新设置的,而是之前的。验证过程1.查看当前会话的隔......
  • MySQL的字符集配置
      utf8的锅:场景 :之前在给客户做微商城时,需要保存微信的授权信息,此时就有一个nickname字段,在设计数据表时,潜意识的将表的存储格式设置为utf8,生产上线一段时间后偶尔出现......
  • mysql参数配置文件
    (1)参数配置文件中的内容以键值对形式存在。(2)如何查看键值对?showvariableslike'%name%';或者查看information_schema库下的global_variables视图; 如何修改呢?  1、innod......
  • golang.mysql
    一、mysql操作基本语法1、创建名称nulige的数据库 ​​CREATEDATABASEnuligeDEFAULTCHARSETutf8COLLATEutf8_general_ci;<br><br>usenulige​​2、建表,Id自增​​c......
  • MySQL锁
       分类 MySQL中的锁,按照锁的粒度分,分为以下三类: 全局锁:锁定数据库中的所有表。表级锁:每次操作锁住整张表。行级锁:每次操作锁住对应的行数据。全局锁全局......