InnoDB引擎之flush脏页

这篇具有很好参考价值的文章主要介绍了InnoDB引擎之flush脏页。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

利用 WAL 技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能,由此也带来了内存脏页的问题。

 脏页会被后台线程自动 flush,也会由于数据页淘汰而触发 flush,而刷脏页的过程由于会占用资源,可能会让你的更新和查询语句的响应时间长一些。

 

一、flush 脏页

当内存数据页跟磁盘数据页内容不一致的时候,我们成这个内存页为“脏页”;内存数据写入磁盘后,内存和磁盘上的数据页内容就一致了,称为“干净页”。

 文章来源地址https://www.toymoban.com/news/detail-409608.html

InnoDB引擎以页作为磁盘和内存之间交互的基本单位,数据库 I/O 操作的最小单位是页。也就是说,在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。

InnoDB引擎之flush脏页

 

 

 

记录是按照行来存储的,但是数据库的读取并不以行为单位,否则一次读取(也就是一次 I/O 操作)只能处理一行数据,效率会非常低。 

Buffer Pool 中存的就是一页一页的数据,当我们要查询的数据不在 Buffer Pool 中时,InnoDB 会将记录所在的页整个加载到 Buffer Pool 中去。

同样的,将 Buffer Pool 中的脏页刷入磁盘时,也是按照页为单位刷入磁盘的。

  

1、Free List

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

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

 

3、Flush List

如果我们修改了Buffer Pool中某个缓冲页的数据,那么它就与磁盘上的页不一致了,这样的缓冲页也被称之为脏页(dirty page)。

为了性能问题,我们每次修改缓冲页后,并不着急立刻把修改刷新到磁盘上,而是在未来的某个时间点进行刷新操作。 

如果有了修复发生,不是立刻刷新,那之后再刷新的时,我们怎么知道Buffer Pool中哪些页是脏页,哪些页从来没有被修改过呢?

 

创建一个存储脏页的 Flush list,凡是被修改过的缓冲页对应的控制块都会作为节点加入到这个链表中。

4、LRU List

除了以上,Buffer Pool还有另外一种LRU List,整体结构如下:

 

InnoDB引擎之flush脏页

 

 

 

在BufferPool中,内存管理如下:

  • 需要找 free 空闲数据块:free list
  • 需要找冷热访问的数据块:lru list
  • 需要知道哪些数据块是脏的:flush list

 

 

二、刷新方式有哪几种

1、从flush链表中刷新一部分页面到磁盘

 

后台线程会根据当时系统的繁忙程度确定刷新速率,定时从flush链表中刷新一部分页面到磁盘,即:BUF_FLUSH_LIST

 有时后台线程刷新脏页的进度比较慢,导致用户准备加载一个磁盘页到Buffer Pool中时没有可用的缓冲页。此时,就会尝试查看LRU链表尾部,看是否存在可以直接释放掉的未修改缓冲页。

如果没有,则不得不将LRU链表尾部的一个脏页同步刷新到磁盘(与磁盘交互是很慢的,这会降低处理用户请求的速度),即:BUF_FLUSH_SINGLE_PAGE

 

2、从LRU链表的冷数据中刷新一部分页面到磁盘,即:BUF_FLUSH_LRU

 

后台线程会定时从LRU链表的尾部开始扫描一些页面,扫描的页面数量可以通过系统变量innodb_lru_scan_depth来指定,如果在LRU链表中发现脏页,则把它们刷新到磁盘。

控制块里会存储该缓冲页是否被修改的信息,所以在扫描LRU链表时,可以很轻松地获取到某个缓冲页是否是脏页的信息。

 

三、flush性能问题

flush脏页虽然是常态,但是出现以下这两种情况,都是会明显影响性能的:

  1. 一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长;
  2. 日志写满,更新全部堵住,写性能跌为 0,这种情况对敏感业务来说,是不能接受的。

 

InnoDB 会在后台刷脏页,而刷脏页的过程是要将内存页写入磁盘。所以,无论是你的查询语句在需要内存的时候可能要求淘汰一个脏页,还是由于刷脏页的逻辑会占用 IO 资源并可能影响到了你的更新语句,都可能是造成你从业务端感知到 MySQL“抖”了一下的原因。

 

要尽量避免这种情况,你就要合理地设置 innodb_io_capacity 的值,并且平时要多关注脏页比例,不要让它经常接近 75%。 

一旦一个查询请求需要在执行过程中先 flush 掉一个脏页时,这个查询就可能要比平时慢了。

而 MySQL 中的一个机制,可能让你的查询会更慢:在准备刷一个脏页的时候,如果这个数据页旁边的数据页刚好是脏页,就会把这个“邻居”也带着一起刷掉;而且这个把“邻居”拖下水的逻辑还可以继续蔓延,也就是对于每个邻居数据页,如果跟它相邻的数据页也还是脏页的话,也会被放到一起刷。

 

在 InnoDB 中,innodb_flush_neighbors 参数就是用来控制这个行为的,值为 1 的时候会有上述的“连坐”机制,值为 0 时表示不找邻居,自己刷自己的。

找“邻居”这个优化在机械硬盘时代是很有意义的,可以减少很多随机 IO。机械硬盘的随机 IOPS 一般只有几百,相同的逻辑操作减少随机 IO 就意味着系统性能的大幅度提升。

而如果使用的是 SSD 这类 IOPS 比较高的设备的话,建议你把 innodb_flush_neighbors 的值设置成 0。因为这时候 IOPS 往往不是瓶颈,而“只刷自己”,就能更快地执行完必要的刷脏页操作,减少 SQL 语句响应时间。

在 MySQL 8.0 中,innodb_flush_neighbors 参数的默认值已经是 0 了。

 

参考资料:

https://hackmysql.com/post/book-6/

《MySQL实战45讲》

 

 

 

到了这里,关于InnoDB引擎之flush脏页的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【搜索引擎数据库】

    一、搜索引擎数据库简介 1.1、  搜索引擎数据库简介       通常意义上的数据库即指数据库系统(Database System,简称 DBS),由数据库、数据库管 理系统、应用程序、管理员四部分组成。DBMS 是数据库 系统的基础和核心,作为能够使用户定义、创建、维护和控制访问数据库的

    2023年04月17日
    浏览(84)
  • 数据库搜索引擎介绍

    索引的定义:索引是对数据库表的一列或者多列的值进行排序一种结构,使用索引可以快速访问数据表中的特定信息。 通俗来讲,索引就是数据库表的一个目录,通过索引,我们可以迅速的找到数据库中的数据,并进行相应的增删改查等操作。 索引的使用大大加快数据检索

    2024年02月03日
    浏览(51)
  • mysql 数据库引擎介绍

    一、数据库引擎     数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建

    2024年02月14日
    浏览(55)
  • MySQL 数据库存储引擎

    目录 一、存储引擎简介 二、MyISAM存储引擎 1、MylSAM介绍 2、MyISAM表支持3种不同的存储格式 3、MylSAM的特点 4、MyISAM使用的生产场景 三、InnoDB存储引擎 1、InnoDB介绍 2、InnoDB的特点 3、InnoDB适用生产场景 4、MyISAM和InnoDB的区别 四、查看和修改存储引擎 1、查看系统支持的存储引擎

    2023年04月25日
    浏览(57)
  • MySQL的数据库引擎介绍

        数据库引擎就是操作数据库的一段程序或程序段,用于存储、处理和保护数据的核心服务。     利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。数据库应用项目是通过数据库引擎与数据库链接的。     何为

    2024年02月06日
    浏览(50)
  • MySQL数据库之存储引擎

    MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。 存储引擎是

    2024年02月03日
    浏览(54)
  • 数据库简史:多主数据库架构的由来和华为参天引擎的机遇

    注:本文发表后,收到了很多后台反馈,其中关于大型机的早期成就不容省略。微调重发本文,纯属个人观点,错谬之处,仍然期待指正。 2023年10月13日,在北京举办的“ 2023金融业数据库技术大会 \\\"上,有一个非常重要的计划低调地发起了。这就是 \\\"北京金融信息化研究所

    2024年02月08日
    浏览(51)
  • 大数据ClickHouse(五):数据库引擎介绍与实例演示

    文章目录 数据库引擎介绍与实例演示 一、Ordinary默认数据库引擎 二、MySQL数据库引擎

    2024年02月03日
    浏览(48)
  • ClickHouse--04--数据库引擎、Log 系列表引擎、 Special 系列表引擎

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ClickHouse 中支持在创建数据库时指定引擎,目前比较常用的两种引擎为默认引擎 和 MySQL 数据库引擎。 Ordinary 就是 ClickHouse 中默认引擎,如果不指定数据库引擎创建的就是Ordinary 数据库引擎,在这种数据

    2024年02月20日
    浏览(53)
  • 【MySQL数据库 | 第十六篇】存储引擎

    目录  前言:  MySQL体系结构图: 存储引擎简介: 1. InnoDB存储引擎: 2. MyISAM存储引擎: 3. MEMORY存储引擎: 4. NDB Cluster存储引擎: 5. ARCHIVE存储引擎: 存储引擎语法: ACID与行级锁:  总结: 经过前面15篇的学习,我们已经学完了SQL的基本语法内容,大致掌握了数据库的操作

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包