首页 > 其他分享 >delete 表数据,磁盘空间为什么没有被释放?【转】

delete 表数据,磁盘空间为什么没有被释放?【转】

时间:2024-05-10 13:55:05浏览次数:18  
标签:释放 删除 记录 磁盘空间 DDL TABLE 数据 delete

最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多。

为了节约成本,定期进行数据备份,并通过delete删除表记录。

明明已经执行了delete,可表文件的大小却没减小,令人费解

项目中使用Mysql作为数据库,对于表来说,一般为表结构和表数据。表结构占用空间都是比较小的,一般都是表数据占用的空间。

当我们使用 delete删除数据时,确实删除了表中的数据记录,但查看表文件大小却没什么变化。

Mysql数据结构

凡是使用过mysql,对B+树肯定是有所耳闻的,MySQL InnoDB 中采用了 B+ 树作为存储数据的结构,也就是常说的索引组织表,并且数据时按照页来存储的。因此在删除数据时,会有两种情况:

  • 删除数据页中的某些记录
  • 删除整个数据页的内容

表文件大小未更改和mysql设计有关

比如想要删除 R4 这条记录:

图片

InnoDB 直接将 R4 这条记录标记为删除,称为可复用的位置。如果之后要插入 ID 在 300 到 700 间的记录时,就会复用该位置。由此可见,磁盘文件的大小并不会减少。

通用删除整页数据也将记录标记删除,数据就复用用该位置,与删除默写记录不同的是,删除整页记录,当后来插入的数据不在原来的范围时,都可以复用位置,而如果只是删除默写记录,是需要插入数据符合删除记录位置的时候才能复用。

因此,无论是数据行的删除还是数据页的删除,都是将其标记为删除的状态,用于复用,所以文件并不会减小。

那怎么才能让表大小变小

DELETE只是将数据标识位删除,并没有整理数据文件,当插入新数据后,会再次使用这些被置为删除标识的记录空间,可以使用OPTIMIZE TABLE来回收未使用的空间,并整理数据文件的碎片。

OPTIMIZE TABLE 表名;

注意:OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

另外,也可以执行通过ALTER TABLE重建表

ALTER TABLE 表名 ENGINE=INNODB

有人会问OPTIMIZE TABLE和ALTER TABLE有什么区别?

alter table t engine = InnoDB(也就是recreate),而optimize table t 等于recreate+analyze

Online DDL

最后,再说一下Online DDL,dba的日常工作肯定有一项是ddl变更,ddl变更会锁表,这个可以说是dba心中永远的痛,特别是执行ddl变更,导致库上大量线程处于“Waiting for meta data lock”状态的时候。因此在 5.6 版本后引入了 Online DDL。

Online DDL推出以前,执行ddl主要有两种方式copy方式和inplace方式,inplace方式又称为(fast index creation)。

相对于copy方式,inplace方式不拷贝数据,因此较快。但是这种方式仅支持添加、删除索引两种方式,而且与copy方式一样需要全程锁表,实用性不是很强。Online方式与前两种方式相比,不仅可以读,还可以支持写操作。

执行online DDL语句的时候,使用ALGORITHM和LOCK关键字,这两个关键字在我们的DDL语句的最后面,用逗号隔开即可。示例如下:

ALTER TABLE tbl_name ADD COLUMN col_name col_type, ALGORITHM=INPLACE, LOCK=NONE;

ALGORITHM选项

  • INPLACE:替换:直接在原表上面执行DDL的操作。
  • COPY:复制:使用一种临时表的方式,克隆出一个临时表,在临时表上执行DDL,然后再把数据导入到临时表中,在重命名等。这期间需要多出一倍的磁盘空间来支撑这样的 操作。执行期间,表不允许DML的操作。
  • DEFAULT:默认方式,有MySQL自己选择,优先使用INPLACE的方式。

LOCK选项

  • SHARE:共享锁,执行DDL的表可以读,但是不可以写。
  • NONE:没有任何限制,执行DDL的表可读可写。
  • EXCLUSIVE:排它锁,执行DDL的表不可以读,也不可以写。
  • DEFAULT:默认值,也就是在DDL语句中不指定LOCK子句的时候使用的默认值。如果指定LOCK的值为DEFAULT,那就是交给MySQL子句去觉得锁还是不锁表。不建议使用,如果你确定你的DDL语句不会锁表,你可以不指定lock或者指定它的值为default,否则建议指定它的锁类型。

执行DDL操作时,ALGORITHM选项可以不指定,这时候MySQL按照INSTANT、INPLACE、COPY的顺序自动选择合适的模式。也可以指定ALGORITHM=DEFAULT,也是同样的效果。如果指定了ALGORITHM选项,但不支持的话,会直接报错。

OPTIMIZE TABLE 和 ALTER TABLE 表名 ENGINE=INNODB都支持Oline DDL,但依旧建议在业务访问量低的时候使用

总结

delete 删除数据时,其实对应的数据行并不是真正的删除,仅仅是将其标记成可复用的状态,所以表空间不会变小。

可以重建表的方式,快速将delete数据后的表变小(OPTIMIZE TABLE 或ALTER TABLE),在 5.6 版本后,创建表已经支持 Online 的操作,但最好是在业务低峰时使用

不懂就问:delete 表数据,磁盘空间为什么没有被释放?
https://mp.weixin.qq.com/s/hID5tIamld6f9rRcUqG6CA

标签:释放,删除,记录,磁盘空间,DDL,TABLE,数据,delete
From: https://www.cnblogs.com/paul8339/p/18184154

相关文章

  • threading:Python线程锁与释放锁
    控制资源访问前文提到threading库在多线程时,对同一资源的访问容易导致破坏与丢失数据。为了保证安全的访问一个资源对象,我们需要创建锁。示例如下:importthreadingimporttimeclassAddThread():def__init__(self,start=0):self.lock=threading.Lock()......
  • DeleteChar函数
    设计一程序实现功能,处理字符串A,处理规则是只要B字里面有的字母,不分大小写,一律从A字符串中删掉。char*delChar(char*A,constchar*B){intc;//记录A中相同的字符数且与B中字符相同的情况while(*B){if((*B<'A'||*B>'Z')&&(*B<'a'||*B>'z&......
  • openGauss 磁盘空间达到阈值-数据库只读
    磁盘空间达到阈值,数据库只读问题现象执行非只读SQL时报错如下。ERROR:cannotexecute%sinaread-onlytransaction.或者运行中部分非只读SQL(insert、update、createtableas、createindex、altertable及copyfrom等)时报错。cancelingstatementduetodefault_tran......
  • Cleanmgr,也称为磁盘清理器(Disk Cleanup),是Windows操作系统中的实用工具,用于删除计算机
    cleanmgr|MicrosoftLearnCleanmgr,也称为磁盘清理器(DiskCleanup),是Windows操作系统中的实用工具,用于删除计算机上不需要的临时文件、回收站文件、下载文件以及其他可以安全删除的文件,以释放磁盘空间。功能特点:释放磁盘空间:Cleanmgr可以帮助用户识别并删除不再需要的......
  • 数据表删除DROP TRUNCATE DELETE区别
    总的来说,DROP用于删除整个数据库对象(表结构和数据全部删除),DELETE用于删除表中的数据,而TRUNCATE也是删除表中的数据,但比DELETE更快,且无法指定条件删除。根据需求,选择适当的命令来删除数据或对象。 DROP:1.DROP用于删除数据库对象,例如表(table)、索引(index)、视图(view)等。2......
  • 华为云云原生FinOps解决方案,释放云原生最大价值
    华为云云原生FinOps通过可视化的成本洞察和成本优化,帮助用户精细用云以提升单位成本的资源利用率,实现降本增效目标企业上云现状:上云趋势持续加深,但云上开支存在显著浪费根据Flexer2024年最新的一项调查显示,当前有超过70%的企业重度使用云服务,而这个数据去年是65%。由此可见,越......
  • 释放Stable Diffusion 无限可能
     最近在整理大语言模型的系列内容,StableDiffusion 是我下一篇博客的主题。关注StableDiffusion,是因为它是目前最受欢迎和影响力最大的多模态生成模型之一。StableDiffusion于2022年8月发布,主要用于根据文本的描述产生详细图像,当然它也可以应用于其他任务,比如内补绘制......
  • C/C++:new/delete与malloc/free的区别
    `new`和`delete`是C++中的关键字,而`malloc()`和`free()`是C语言中的函数。它们在内存分配和释放方面有几个重要区别:1.**类型安全性**:-`new`和`delete`是C++中的运算符,它们会自动计算所需的内存大小,并返回正确类型的指针。这意味着你不需要在使用时显式指定......
  • 列表删除按钮,分页错位问题解决思路 table delete page loadTable
    列表删除按钮,分页错位问题解决思路this.$api('/xxx/xxx/deletexxx',{ids:id}).then(res=>{if(res.status!==20)returnthis.$Message.destroy()this.$Message.success('删除成功')if(this.tableData.leng......
  • VMware之Ubuntu20.04拓展根目录磁盘空间
    1、改变虚拟磁盘大小关闭Ubuntu右键—>设置—>硬盘—->实用工具—>扩展填入扩展后的分区大小确定2、查看磁盘使用情况开启Ubuntu输入:df-hcl@cl:~$df-hFilesystemSizeUsedAvailUse%Mountedonudev955M0955M0%/devtmpfs......