当前位置:首页 > 业绩展示 > 国际业绩

Mysql脏页刷新和收缩表空间的原理分析

2021-03-31 20:20:43浏览: 139次 来源:网络整理 作者:佚名

本文主要介绍Mysql脏页刷新和缩小表空间的原理分析。本文介绍的示例代码非常详细。它对每个人的学习或工作都有一定的参考学习价值。需要它的朋友可以参考它。

mysql脏页

由于WAL机制,当InnoDB更新该语句时,它将创建一个磁盘操作,称为重做日志,即重做日志。将重做日志写入内存后,它将返回到客户端,即更新成功。

将内存中的数据写入磁盘的过程是刷新,在刷新之前,实际数据与数据库中的数据不一致,因为重做日志已更新且尚未写入,数据库较旧如果内存数据页的内容与磁盘数据页的内容不一致,则将内存页称为脏页。写入内存后,它是一致的,称为干净页。

如果mysql偶尔运行缓慢,则可能是刷新脏页。触发数据库刷新的过程

重做日志已满亚博APp买球首选 ,系统停止所有更新操作,前进检查点,并释放空间以继续写入。

系统内存不足,新的内存页不足。某些数据页将被删除,并保留用于其他数据页。如果消除了脏页,则将它们首先写入磁盘。

当mysql空闲时。

当mysql正常关闭时

在第一种情况下,重做日志已满。 Innodb应该避免这种情况,因为无法再更新整个系统,这是不可接受的

在第二种情况下,当内存已满时,必须先将其写入磁盘。 Innodb使用缓冲池来管理内存。有三种状态。

未使用的内存页面

已使用,是一个干净的页面

使用过的页面和脏页面(删除后需要将其写入磁盘)

因此,有时我们发现使用数据库时数据库性能突然下降,这可能是在处理脏页。

脏页面刷新控制策略

Innodb_io_capacity参数,此参数将告诉innodb您的磁盘io容量。 (使用公式计算)

innodb刷新有两个主要因素:脏页的比率和重做日志的写入速度

innodb_max_derty_pages_pct是脏页比例的上限,默认值为75%,调整Innodb_io_capacity参数值,以使脏页比例不超过75%来缩小表空间

方案示例:数据库占用太多空间,最大表的一半被删除,但表的大小保持不变。

数据删除过程

要删除R4,InnoDB引擎只会将R4的记录标记为已删除。如果以后添加ID在300-600之间的记录,该位置将被重用,但是磁盘文件的大小不会减小。

如果删除数据页上的所有记录,则该数据页可以重复使用。

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

例如,如果删除R4的记录,如果插入ID为400的行,则该空间将被直接重用,但是如果插入ID为800的行,则该位置将不能被重用。

但是在删除整个数据页Page A上的所有记录之后,pageA被标记为可重用。如果需要新的数据页来插入ID = 50的记录,则可以使用PageA。

如果使用delete命令删除整个表数据,结果是所有数据页都将被标记为可重用,但是在磁盘上KU酷游官网 ,文件不会变小。

插入数据流

如果按索引顺序插入数据,则索引是紧凑的,但如果随机插入,则将分页索引的数据页。

如果pageA已满,那么插入一行数据时会发生什么?由于A已满,因此当插入ID为550的数据时,将应用新页面pageB来保存数据。拆分完成后,在pageA的末尾留下一个孔。

更新索引上的值是删除一个旧值,然后插入一个新值,这也会引起漏洞。

缩小空间

创建具有与表A相同结构的新表B。根据主键ID的升序,从A逐行读取数据并将其插入表B。表B中没有孔,并且数据页的利用率也更高,如果我们使用表B作为临时表mysql 收缩表空间,则在完成了将数据从表A导入到表B的操作之后泛亚时时乐 ,用B替换A也会缩小A的效果。

在整个DDL过程中,表A无法更新mysql 收缩表空间,因此此DDL不处于联机状态。在5. 6之后的版本中,该过程已更改:

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

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

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

生成临时文件后,将日志文件的操作应用于临时文件,并获得具有与表A相同逻辑数据的数据文件。

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

如您所见,与图3中的过程的不同之处在于,由于存在日志文件记录和重放操作,因此该解决方案允许在重建表的过程中添加,删除和修改表A。

使用alter table A engine = InnoDB命令来重建表。在MySQL 5. 5之前,此命令的执行过程与我们之前描述的相似,只是您不需要创建此临时表B。 MySQL将自动完成转储数据,交换表名和删除旧表的操作。

以上是本文的全部内容。我希望它对每个人的学习都有帮助,也希望您能更多地支持Scripthome。

上一篇 开颅手术后三遍,花生红糖吃了牛奶
下一篇