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

这篇文章主要介绍了Mysql脏页flush及收缩表空间原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

mysql脏页

由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,就返回给客户端, 即更新成功。

把内存里的数据写入磁盘的过程,术语就是flush,在flush之前,实际数据和数据库中的数据是不一致的,因为在redo log基础上更新了还未写入,数据库是老的,当内存数据页跟磁盘数据页内容不一致的时候,称这个内存页为脏页,内存写入后就一致了,称为干净页,

如果mysql偶尔运行速度很慢,很可能是在刷脏页。引发数据库flush的过程

redo log满了,系统停止所有更新操作,将checkpoint向前推进,腾出空间继续写。

系统内存不足,需要新的内存页不够用,就会淘汰一些数据页,留给别的数据页使用,如果淘汰的是脏页,就会先写到磁盘。

mysql空闲的时候。

正常关闭mysql的时候

在第一种情况下,redo log满了,这种情况是innodb要避免的,因为整个系统都不能再更新了,这是不能接受的

第二种情况,内存满了,要先写到磁盘,innodb用缓冲池管理内存,有三种状态

还没有用的内存页

用了并且是干净页

用了并且是脏页(淘汰的时候需要写入到磁盘)

所以我们有时使用数据库会发现数据库性能突然下降,可能就是在处理脏页。

刷脏页控制策略

Innodb_io_capacity参数,这个参数会告诉innodb你的磁盘io能力。(有公式计算)

innodb刷盘主要两个因素:脏页比例和redo log的写盘速度

innodb_max_derty_pages_pct是脏页比例上限,默认是75%,调整好Innodb_io_capacity参数值,使脏页比例不要超过75%收缩表空间

场景例子:数据库占用空间太大,把最大的表删掉了一半数据,表的大小还是没有变化。

数据删除流程

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

加入要删掉R4,InnoDB引擎只会把R4这个记录标记为删除,如果之后再掺入一个ID在300-600之间的记录时,会复用这个位置,但是磁盘文件的大小并不会缩小。

如果删掉了一个数据页上的所有记录,这个数据页就可以被复用。

注意:数据页的复用跟记录的复用是不同的。

比如R4这条记录被删除,如果插入一个ID是400的行,直接复用这个空间,但是如果插入ID是800的行,就不能复用这个位置了。

但是整个数据页Page A上的所有记录删除之后,pageA标记为可复用,如果插入一条ID=50的记录需要用新的数据页的时候,PageA是可以背负用的。

如果我们用delete命令把整个表数据删除,结果是所有的数据页都会标记为可复用,但是在磁盘上,文件不会变小。

插入数据流程

如果数据按照索引顺序插入的,索引是紧凑的,但是如果是随机插入的,就会造成索引的数据页分页。

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

如果pageA已经满了,在插入一行数据会怎样?由于A满了,在插入一个id是550的数据时,就会申请一个新的页面pageB来保存数据,分裂完成后pageA的末尾就留下了空洞。

更新索引上的值也是删除一个旧的值,再插入一个新值,也会造成空洞。

收缩空间

新建一个与表A相同结构的表B,按照主键ID递增的顺序,把数据一行一行的从A里读出来再插入到表B中,表B中无空洞,数据页的利用率也更高,如果我们把表B作为临时表,数据从表A导入到B中的操作完成后,用B替换A,从效果上也起到了收缩A的作用。

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

在整个DDL过程中,表A不能有更新,所以这个DDL不是online的,在5.6之后的版本中,流程做了更改:

建立一个临时文件,扫描A中的所有数据页,

用数据页中A的记录生成B+树,存储在临时文件中

将所有对A的操作记录在一个日志文件中

临时文件生成后,将日志文件的操作应用到临时文件,得到一个逻辑数据上与表A相同的数据文件

用临时文件替换表A的数据文件

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

可以看到,与图3过程的不同之处在于,由于日志文件记录和重放操作这个功能的存在,这个方案在重建表的过程中,允许对表A做增删改操作。

使用alter table A engine=InnoDB命令来重建表。在MySQL 5.5版本之前,这个命令的执行流程跟我们前面描述的差不多,区别只是这个临时表B不需要你自己创建,MySQL会自动完成转存数据、交换表名、删除旧表的操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

来源:脚本之家

链接:https://www.jb51.net/article/195379.htm

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:SEO优化专员,转转请注明出处:https://www.chuangxiangniao.com/p/895630.html

(0)
上一篇 2025年1月4日 00:22:42
下一篇 2025年1月4日 00:15:46

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Mysql读写分离过期常用解决方案

    这篇文章主要介绍了Mysql读写分离过期常用解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 mysql读写分离的坑 读写分离的主要目标是分摊主库的压力,由客户端选择后端数据库进行查…

    2025年1月4日
    100
  • mysql常用备份命令和shell备份脚本分享

    这篇文章主要介绍了mysql常用备份命令和shell备份脚本,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下 备份多个数据库可以使用如下命令: mysqldump -uroot -p123456 –databa…

    数据库 2025年1月4日
    100
  • Mysql误删数据解决方案及kill语句原理

    这篇文章主要介绍了Mysql误删数据解决方案及kill语句原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 mysql误删数据 使用delete语句误删数据行 使用drop table或…

    2025年1月4日 数据库
    100
  • MySQL limit分页大偏移量慢的原因及优化方案

    这篇文章主要介绍了MySQL limit分页大偏移量慢的原因及优化方案,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下 在 MySQL 中通常我们使用 limit 来完成页面上的分页功能,但是当数据量达到一个很大的值之后,…

    2025年1月4日
    100
  • MySQL主从复制原理以及需要注意的地方

    这篇文章主要介绍了MySQL主从复制原理以及需要注意的地方,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下 写在前面 最近在写Mycat专题,由于不少小伙伴最近要出去面试,问我能不能简单写下MySQL的主从复制原理和注意事…

    2025年1月4日
    100
  • Mysql联表update数据的示例详解

    这篇文章主要介绍了Mysql联表update数据的示例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 1.MySQL UPDATE JOIN语法 在MySQL中,可以在 UPDATE语句 中使…

    数据库 2025年1月4日
    100
  • MySQL数据类型优化原则

    这篇文章主要介绍了MySQL数据类型优化原则的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下 MySQL支持的数据类型很多,选择正确的数据类型对于高性能至关重要。下面几个简单的原则都有助于做出更好的选择。 更小的…

    2025年1月4日
    100
  • MySQL分组查询和聚合函数

    这篇文章主要介绍了MySQL 分组查询和聚合函数的相关资料,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下 概述 相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的…

    2025年1月4日
    100
  • 专业级的MySQL开发设计规范及SQL编写规范

    这篇文章主要介绍了专业级的MySQL开发设计规范及SQL编写规范,需要的朋友可以参考下 在团队开发过程中为了项目的稳定,代码的高效,管理的便捷制定内部种开发设计规范是必不可少的, 这里分享一份我们定义MySQL开发设计规范包括表设计规范,字…

    数据库 2025年1月4日
    100
  • 如何把本地mysql迁移到服务器数据库

    这篇文章主要介绍了如何把本地mysql迁移到服务器数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们可以使用linux的scp命令(scp无法在windows使用),加上mysql…

    2025年1月4日
    100

发表回复

登录后才能评论

联系我们

156-6553-5169

在线咨询: QQ交谈

邮件:253000106@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

联系微信