为什么表数据删一半,表文件大小不变?

1.引言

可能会有人问,为什么把表中的数据删除了一半,但是表文件的大小没变?

首先,我们以InnoDB引擎为例。一个InnoDB表包含两部分,表结构定义和数据。在MySQL8.0版本以前,表结构是存在以.frm为后缀的文件里。MySQL8.0之后,允许把表结构放在系统数据表中了,因为占用很小。

表数据既可以存在共享表空间里,也可以是单独的文件。这个是由参数innodb_file_per_table控制的,当参数为OFF时,表的数据放在共享表空间内,也就是和数据字典存放在一起。当参数为ON时,每个InnoDB表数据存储在以.ibd为后缀的文件。从MySQL5.6开始,这个参数默认就是ON。

推荐将innodb_file_per_table参数设置为ON,因为一个表单独存储为一个文件更容易管理。

2.删除数据流程

根据前面的章节,我们知道InnoDB里面的索引都是用B+树来存储的。
在这里插入图片描述

假设要删除R4这个记录,InnoDB引擎只会把R4这个记录标记为删除。如果之后插入的数据在300和600之间,那么就可能会复用这个位置。但是磁盘文件的大小不会缩小,这种就像存在“空洞”一样。

因为InnoDB的数据是按页存储的,那如果删掉了一整个数据页的数据会怎么样?答案是整个数据页就可以被复用

但是,数据页的复用和记录的复用是不同的

  • 记录的复用:只限于符合范围条件中的数据。例如插入数据700的话,那就不能复用400的位置。
  • 数据页的复用:当整个数据页从B+树中摘除后,可以复用任何位置。当其它地方需要新页的时候,是可以被复用的。

因此,回到之前的问题。当把整个表的数据删除了,所有数据页都会变为可复用,但是不会改变文件在磁盘中的大小。

3.插入数据流程

不仅删除数据会造成这种情况,插入数据也会造成这种情况。如下图所示:
在这里插入图片描述

例如上图中,由于Page A满了,再插入一个新值,就会造成数据页的分裂,也会出现“空洞”。

4.重建表

通过重建表的方式就可以达到去除“空洞”。

我们可以新建一个与表A结构相同的表B,然后按照主键ID递增的顺序,将数据一行一行地从表A读出来再插入到表B中。这样就可以消除表A主键索引上的空洞。如下图所示:
在这里插入图片描述

在MySQL中,我们可以使用alter table A=InnoDB命令来重建表。 在MySQL5.5之前,过程就和上面描述地是一样的。

显然这种方式最花时间的地方在往临时表插入数据上。这就导致如果在这个过程中,有新的数据写入A表,就会造成数据流程。因此这种方式不是Online的

在MySQL5.6版本之后开始引入了Online DDL,对流程进行了优化,流程如下:

  1. 建立一个临时文件,扫描表A主键的所有数据页
  2. 用数据页中表A的记录生成B+树,存储到临时文件中。
  3. 生成临时文件的过程中,将所有对A的操作记录在一个日志文件(row log)中。
  4. 临时文件生成后,将日志文件应用到临时文件中,得到一个逻辑数据与表A相同的数据文件。
  5. 用临时文件替换表A的数据文件。

如下图所示:
在这里插入图片描述
来源:自己整理的MySQL实战45讲笔记

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将CAD文件转换为PDF并保持大小不变,可以使用iText库结合AutoCAD软件进行操作。 iText是一款强大的Java库,可用于处理PDF文档。首先,您需要将CAD文件导出为DXF格式文件,然后使用AutoCAD的API(如AutoCAD .NET API)将DXF文件转换为PDF。接下来,使用iText库将PDF文件进行处理,以实现大小不变的转换。 以下是大致步骤: 1. 使用AutoCAD软件打开CAD文件,并将其导出为DXF格式文件。这样,您就能够使用DXF文件作为输入。 2. 在Java中,使用AutoCAD的API(例如AutoCAD .NET API)读取DXF文件,并将其转换为PDF格式。这一步需要您熟悉AutoCAD API的使用。 3. 保存转换后的PDF文件到目标位置。 4. 使用iText库,在Java中读取生成的PDF文件。使用iText提供的API,您可以对PDF文档进行各种操作,例如合并多个PDF文档,添加和删除页面,设置页面大小和页眉页脚等。 5. 在使用iText的过程中,注意保持PDF文档的原始大小。确保在处理过程中不对文件进行缩放或更改页面尺寸等操作。 6. 最后,将处理后的PDF文件保存到所需的位置,它将与原始CAD文件的大小保持一致。 请注意,这只是一个基本的框架,具体实现需要您深入研究和编写适合您项目的代码。 总之,要将CAD文件转换为PDF并保持大小不变,您可以使用AutoCAD的API将CAD文件转换为DXF格式,然后使用iText库在Java中读取并处理DXF文件,最终转换为PDF并保持大小不变

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值