MySQL的Flush-List和脏页的落盘机制

一、回顾

MySQL启动后Buffer Pool会初始化。Buffer Pool也会初始化好N多个空白的缓存页,以及它们的描述数据会被组织成LRU链表以及FreeList 双向链表。

这时你从磁盘中读取一个数据页,会先从Free List中找出一个空闲缓存页的描述信息,然后将你读出的数据页中加载进缓存页中。同时将缓存页的描述信息从Free List中剔除,此外该描述信息块还会被维护进LRU链表中。

数据页被加载进Buffer Pool后你就可以对其进行变更操作了。

二、Flush List

为了加快响应客户端的速度,MySQL会在Buffer Pool中对数据进行修改,可是一旦你对LRU链表中的缓存页做了修改,那该页中的数据和磁盘中的数据页信息就不一致了!大家一般管这种数据页叫做脏页。

为了保证数据的最终一致性,MySQL是需要将脏页刷新回磁盘的!

但是问题是:需要将哪些数据页刷新回磁盘呢?

这就引出了Flush List~

Flush List 和 Free List很像,都是由Buffer Pool中数据描述信息组织而成的双向链表。

一旦你对内存中的缓冲页作出了修改,那该缓冲页对应的描述信息块就会添加进 Flush List。这样当Buffer Pool中的数据页不够用时,我们就可以优先将 Flush List中的脏数据页刷新进磁盘中。

如果你读了前几篇文章那你肯定知道了 LRUList、FreeList、FlushList、Buffer Pool、脏页、脏数据。

下面乘胜追击!一起看一下脏页的落盘机制

三、什么是脏页?什么是脏数据?

什么是脏页?

我在介绍Flush List 的那篇文章有提及,脏页就是LRU链表中被修改了的缓存页。他们和磁盘中的数据页不一致,脏页是需要被刷新回磁盘的。

什么是脏数据?

这个问题其实引出了脏读的概念。举个例子:事物A中读取到了事物B中未提交的数据,我们管这些数据叫做脏数据。

四、脏页刷回磁盘的时机

当Buffer Pool不够用时,根据LRU机制,MySQL会将Old SubList部分的缓存页移出LRU链表。如果被移除出去的缓存页的描述信息在Flush List中,MySQL就得将其刷新回磁盘。

InnoDB存储引擎将脏页刷回磁盘的时机有蛮多的,你可以把它当作拓展知识大概浏览一下。

1、当MySQL数据库关闭时,会将所有的脏数据页刷新回磁盘。这个功能由参数:innodb_fast_shutdown=0控制,默认让InnoDB在关闭前将脏页刷回磁盘,以及清理掉undo log。

2、有一个后台线程Master Thread会按照每秒或者每十秒的速度,异步的将Buffer Pool中一定比例的页面刷新回磁盘中。

3、在MySQL5.7中,Buffer Pool的刷新由page cleaner threads完成。

我们可以通过innodb_page_cleaners参数控制page cleaner threads线程的数量,但是当你将这个数值调整的比Buffer Pool的数量还大时,MySQL会自动将 innodb_page_cleaners数量设置为innodb_buffer_pool_instances的数量。
Innodb1.1.x之前需要保证LRU列表中有至少100个空闲页可以使用。低于这个阈值就会触发脏页的刷新。
从MySQL5.6,也就是innodb1.2.X开始,innodb_lru_scan_depth参数为每个缓冲池实例指定page cleaner threads 扫描Buffer Pool来查找要刷新的脏页的下行距离。默认为1024,该后台线程每秒都会执行一次。
4、当脏数据页太多时,也会触发将脏数据页刷新回磁盘。该机制可由参数innodb_nax_dirty_pages_pct控制,比如将其设置为75,表示,当Buffer Pool中的脏数据页达到整体缓存的75%时,触发刷新的动作。现实情况是该参数默认值为0。以此来禁用Buffer Pool早期的刷新行为。

5、当redo log不可用时,也会强制脏页列表中的脏页刷新回磁盘。这个机制同样由一个后台线程完成。

五、其他关于脏页刷新的知识点

刷新临接数据页:意思是当MySQL将某脏页刷新回磁盘时,是否也以相同的态度将该脏页邻接的脏页一并刷新回磁盘。

可以通过参数innodb_flush_neighbors控制该过程。

  • 设置为0时表示,禁用刷新邻接的功能。
  • 设置为1时表示,以相同的态度刷新其邻接的脏页。
  • 设置为2时表示,以相同的程度刷新脏页。

那如何选择将其设置为哪种状态呢?

你可以根据MySQL实例所在机器的存储类型来决定。如果为HDD存储建议将其开启,因为HDD的磁盘刷新速率较低,开启该参数后可以有效的减少IO操作。相反如果使用SSD存储,其本身就有高磁盘IO的特性,建议禁用该参数。

以上就是MySQL的Flush-List和脏页的落盘机制的详细内容,更多关于MySQL Flush-List和脏页的落盘机制的资料请关注我们其它相关文章!

(0)

相关推荐

  • MySQL的查询缓存和Buffer Pool

    一.Caches - 查询缓存 下图是MySQL官网给出的:MySQL架构体系图. 人们常说的查询缓存就是下图中的Cache部分. 如果将MySQL分成 Server层和存储引擎层两大部分,那么Caches位于Server层. 另外你还得知道: 当一个SQL打向MySQL Server之后,MySQL Server首选会从查询缓存中查看是否曾经执行过这个SQL,如果曾经执行过的话,之前执行的查询结果会以Key-Value的形式保存在查询缓存中.key是SQL语句,value是查询结果.我们将这个

  • MySQL慢查询如何定位详解

    前言 相信大家在平时工作中都有过 SQL 优化经历,那么在优化前就必须找到慢 SQL 方可进行分析.这篇文章就介绍下如何定位到慢查询. 慢查询日志是 MySQL 内置的一项功能,可以记录执行超过指定时间的 SQL 语句. 以下是慢查询的相关参数,大家感兴趣的可以看下: 参数 含义 log_output 日志输出位置,默认为 FILE,即保存为文件,若设置为 TABLE,则将日志记录到 mysql.show_log 表中,支持设置多种格式 slow_query_log_file 指定慢查询日志文件

  • 浅析MySQL的基数统计

    一.基数是啥? Cardinality指的就是MySQL表中某一列的不同值的数量. 如果这一类是唯一索引,那基数 = 行数. 如果这一列是sex,枚举类型只有男女,那它是基数就是2 Cardinality越高,列就越有成为索引的价值.MySQL执行计划也会基于Cardinality选择索引. 通过下面的方式可以看到表中各列的基数. 比如这个经典的例子: 有一列为sex,那对于sex列中存储的值来说 非男即女,它的基数最大就是2. 那也就完全没有必要为sex建立索引.因为,为了提升你基于sex的查

  • mysql 递归查找菜单节点的所有子节点的方法

    背景 项目中遇到一个需求,要求查处菜单节点的所有节点,在网上查了一下,大多数的方法用到了存储过程,由于线上环境不能随便添加存储过程, 因此在这里采用类似递归的方法对菜单的所有子节点进行查询. 准备 创建menu表: CREATE TABLE `menu` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单id', `parent_id` int(11) DEFAULT NULL COMMENT '父节点id', `menu_name` varch

  • 推荐几款MySQL相关工具

    前言: 随着互联网技术的不断发展, MySQL 相关生态也越来越完善,越来越多的工具涌现出来.一些公司或个人纷纷开源出一些不错的工具,本篇文章主要介绍几款 MySQL 相关实用工具.提醒下,这里并不介绍 Navicat 等这类图形化操作工具哦. 1. SQL 审核 web 工具 SQL 审核与执行,可能是各个公司或团队比较困扰的事情.若没有平台工具支持,只能通过人工的方式来处理,效率低且质量没办法保证.为了规范操作,提高效率,大多数团队可能会自己开发或引入开源工具.这里介绍两款开源免费的 web

  • 浅析MySQL的lru链表

    一.简述传统的LRU链表 LRU:Least Recently Used 相信大家对LRU链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是LRU链表,甚至是让你手写一个LRU链表. 如果你读了上一篇:你有没有搞混查询缓存和BufferPool?谈谈看! 想必你已经知道了MySQL的Buffer Pool机制以及MySQL组织数据的最小单位是数据页.并且你也知道了 数据页在Buffer Pool中是以LRU链表的数据结构组织在一起的. 其实所谓的LRU链表本质上就是一个双

  • Mysql脏页flush及收缩表空间原理解析

    mysql脏页 由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,就返回给客户端, 即更新成功. 把内存里的数据写入磁盘的过程,术语就是flush,在flush之前,实际数据和数据库中的数据是不一致的,因为在redo log基础上更新了还未写入,数据库是老的,当内存数据页跟磁盘数据页内容不一致的时候,称这个内存页为脏页,内存写入后就一致了,称为干净页, 如果mysql偶尔运行速度很慢,很可能是在刷脏页.引发数据库flus

  • MySQL的表空间是什么

    今天我要跟你分享的话题是:"大家常说的表空间到底是什么?究竟什么又是数据表?" 这其实是一个概念性的知识点,当作拓展知识.涉及到的概念大家了解一下就好,涉及的参数,留个印象就好. 一.什么是表? 但凡是用过MySQL都知道,直观上看,MySQL的数据都存在数据表中. 比如一条Update SQL: update user set username = '白日梦' where id = 999; 它将user这张数据表中id为1的记录的username列修改成了'白日梦' 这里的user

  • MySQL的Flush-List和脏页的落盘机制

    一.回顾 MySQL启动后Buffer Pool会初始化.Buffer Pool也会初始化好N多个空白的缓存页,以及它们的描述数据会被组织成LRU链表以及FreeList 双向链表. 这时你从磁盘中读取一个数据页,会先从Free List中找出一个空闲缓存页的描述信息,然后将你读出的数据页中加载进缓存页中.同时将缓存页的描述信息从Free List中剔除,此外该描述信息块还会被维护进LRU链表中. 数据页被加载进Buffer Pool后你就可以对其进行变更操作了. 二.Flush List 为了

  • mysql脏页是什么

    目录 脏页(内存页) 为什么会出现 脏页 内存管理机制简述 数据修改和读取只依赖缓冲区行不行 为什么脏页一定要刷新 刷脏页有下面4种场景 会造成的影响 脏页(内存页) 干净页:内存和磁盘中的数据一致 脏页:内存和磁盘中的数据不一致 为什么会出现 脏页 平时很快的更新操作,都是在写内存和日志. 他并不会马上同步到磁盘数据页,这时内存数据页跟磁盘数据页内容不一致,我们称之为脏页. 这里面就涉及 mysql 的内存管理机制 内存管理机制简述 缓冲区中包含这三大类列表.分别为:LRUList.FreeL

  • 浅谈MySQL之浅入深出页原理

    一.页的概览 我们往 MySQL 插入的数据最终都是存在页中的.在 InnoDB 中的设计中,页与页之间是通过一个双向链表连接起来. 而存储在页中的一行一行的数据则是通过单链表连接起来的. 上图中的 User Records 的区域就是用来存储行数据的.那 InnoDB 为什么要这么设计?假设我们没有页这个概念,那么当我们查询时,成千上万的数据要如何做到快速的查询出结果?众所周知,MySQL 的性能是不错的,而如果没有页,我们剩下的只能是逐条逐条的遍历数据了. 那页是如何做到快速查询的呢?在当前

  • Mysql InnoDB引擎中的数据页结构详解

    目录 Mysql InnoDB引擎数据页结构 一.页的简介 二.数据页的结构 三.记录在页中的存储结构 四.记录头信息 1. deleted_flag 2. min_rec_flag 3. n_owned 4. heap_no 5. record_type 6. next_record Mysql InnoDB引擎数据页结构 InnoDB 是 mysql 的默认引擎,也是我们最常用的,所以基于 InnoDB,学习页结构.而学习页结构,是为了更好的学习索引. 一.页的简介 页是 InnoDB 管理

  • 详细的Mysql安装 图解win2003+iis6+php+gd2+mysql安装配置第1/2页

    Mysql 安装 Mysql的安装文件可以直接到 http://www.mysql.com 下载,获得for win32的.zip包,建议选择4.0.20d版本.这里不详细说明. 下载获得Mysql的for win32安装包后,用winzip解压缩,直接运行setup.exe,需要注意的是选择一个安装路径,当然,安装路径可以任意,建议选择C:\MySQL目录.安装完成后MySQL也就完成了.默认的用户名是root,密码为空. Mysql安装完成后,请通过开始-程序-附件-命令提示符进入: 录入c

  • mysql常见问题解决第1/2页

    1  安装MYSQL后更改了ROOT的密码后用  net startmysql  启动时我就遇到了这样的问题.使用以下命令后  c:\mysql\bin\mysqladmin-u root -p shutdown  再net start mysql就没有这个错误提示了! *************  2  MySQL的1067错误 Q:我的Mysql碰到了 1067 错误 错误信息为:  A system error has occurred.  System error 1067 has oc

  • Windows 2016 IIS10.0+PHP+MySQL环境搭建第1/3页

    准备篇 一.环境说明: 操作系统:Windows Server 2016 PHP版本:php 7.1.0 MySQL版本:MySQL 5.7.17.0 二.相关软件下载: 1.PHP下载地址: http://windows.php.net/downloads/releases/php-7.1.0-nts-Win32-VC14-x86.zip 2.MySQL下载地址: http://cdn.mysql.com//Downloads/MySQLInstaller/mysql-installer-co

  • 来自经典的打造简单的PHP&MYSQL留言板第1/4页

    表一: admin 字段: id(int11)   name(varchvr)   password(varchvr) 表二: lo 字段: id(int11)   username(varchvr)  sex(varchvr)  qq(varchvr)  email(varchvr)  info(text)  ip(varchvr)  submit_time(datetime) 1.conn.php(连接数据库文件) 复制代码 代码如下: <?php  mysql_connect("lo

  • 一条sql详解MYSQL的架构设计详情

    目录 1 前言 2 应用层 2.1 连接线程处理 3 服务层 3.1 SQL 接口 3.2 SQL解析器 3.3 SQL优化器 3.4 执行器 3.5 查询缓存 4 存储引擎层 4.1 概述 4.2 缓冲池(buffer pool) 4.2.1 数据页.缓存页和脏页 4.2.2 元数据 4.2.3 free链表 4.2.4 flush链表 4.2.5 LRU链表 4.2.6 小结 4.3 undo log 4.4 redo log 5 总结 1 前言 对于一个服务端开发来说 MYSQL 可能是他

随机推荐