iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >为什么MySQL 删除表数据 磁盘空间还一直被占用
  • 861
分享到

为什么MySQL 删除表数据 磁盘空间还一直被占用

2024-04-02 19:04:59 861人浏览 薄情痞子
摘要

目录1、Mysql数据结构2、表文件大小未更改和mysql设计有关3、那怎么才能让表大小变小4、Online DDL5、总结最近有个上位机获取下位机上报数据的项目,由于上报频率比较频

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

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

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

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

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

1、Mysql数据结构

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

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

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

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

InnoDB 直接将 R4 这条记录标记为删除,称为可复用的位置。如果之后要插入 ID 300 700 间的记录时,就会复用该位置。

由此可见,磁盘文件的大小并不会减少。

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

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

3、那怎么才能让表大小变小

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


OPTIMIZE TABLE 表名;


注意:OPTIMIZE TABLE只对MyISAM, BDBInnoDB表起作用。

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


ALTER TABLE 表名 ENGINE=INNODB


有人会问OPTIMIZE TABLEALTER TABLE有什么区别?

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

4、Online DDL

最后,再说一下Online DDLdba的日常工作肯定有一项是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语句的时候,使用ALGoRITHMLOCK关键字,这两个关键字在我们的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按照INSTANTINPLACECOPY的顺序自动选择合适的模式。也可以指定ALGORITHM=DEFAULT,也是同样的效果。如果指定了ALGORITHM选项,但不支持的话,会直接报错。

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

5、总结

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

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

到此这篇关于为什么MySQL 删除表数据 磁盘空间还一直被占用的文章就介绍到这了,更多相关MySQL 删除表数据 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 为什么MySQL 删除表数据 磁盘空间还一直被占用

本文链接: https://www.lsjlt.com/news/154573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么MySQL 删除表数据 磁盘空间还一直被占用
    目录1、Mysql数据结构2、表文件大小未更改和mysql设计有关3、那怎么才能让表大小变小4、Online DDL5、总结最近有个上位机获取下位机上报数据的项目,由于上报频率比较频...
    99+
    2024-04-02
  • Delete mysql表数据后磁盘空间却还是被占用的原因
    这篇文章主要介绍“Delete mysql表数据后磁盘空间却还是被占用的原因”,在日常操作中,相信很多人在Delete mysql表数据后磁盘空间却还是被占用的原因问题上存在疑惑,小编查阅了各式资料,整理出...
    99+
    2024-04-02
  • MySQL delete删除数据后,释放磁盘空间
    当 MySQL 数据库服务删除部分数据后;有些情况下这些数据占用的存储空间会释放掉,有些情况这些存储空间则不会释放。以下是对这种情况的简单说明: 一、删除表|清空数据表 当执行删除数据表或者清空数据表的全部数据操作时,都会释放掉相应的磁盘存...
    99+
    2023-08-18
    mysql delete
  • Mysql 删除数据,磁盘空间未释放解决办法
    公司的服务器上添加了硬盘监控,收到报警后,确认是mysql的文件占用空间比较大。于是,确认是哪个表占空间比较大后,删除了部分数据,服务器硬盘空间并没有释放掉,报警仍旧存在。 原因及解决办法: 使用de...
    99+
    2023-09-11
    mysql 数据库
  • 删除一张大表时为什么undo占用空间接近原表两倍
    这篇文章将为大家详细讲解有关删除一张大表时为什么undo占用空间接近原表两倍,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述Oracle中,undo是保存...
    99+
    2024-04-02
  • MySQL5.7的表删除数据后的磁盘空间释放过程
    本篇内容介绍了“MySQL5.7的表删除数据后的磁盘空间释放过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • 清除MongoDB所占用的多余的磁盘空间的方法是什么
    这期内容当中小编将会给大家带来有关清除MongoDB所占用的多余的磁盘空间的方法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 首先一...
    99+
    2024-04-02
  • 为什么 `go mod` 占用了另一个磁盘上的空间而不是我的 GOPATH?
    问题内容 我正在尝试构建一个全新的项目以运行一些单元测试。我正在使用 Windows + WSL。 当我尝试运行测试时,显然首先它会获取 go.mod 文件并开始下载所有包。 尽管我的...
    99+
    2024-02-06
  • oracle删除数据但表空间占用率没有减小的情况
    目录oracle删除数据但表空间占用率没有减小oracle 大表删除数据后,回收空间的问题一般有一下几种方法总结oracle删除数据但表空间占用率没有减小 使用delete...
    99+
    2023-02-15
    oracle删除数据 oracle表空间占用率 oracle表没有减小
  • 数据库中crfclust.bdb占用巨大空间导致磁盘空间利用率较高怎么办
    这篇文章将为大家详细讲解有关数据库中crfclust.bdb占用巨大空间导致磁盘空间利用率较高怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。收到告警日志,提示数据库...
    99+
    2024-04-02
  • MySQL什么情况下删除数据会释放空间
    1、drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM 2、truncate table table_name 立刻释放磁盘空间 ,不管是 In...
    99+
    2024-04-02
  • mysql删除数据时为什么不用delete
    本篇内容介绍了“mysql删除数据时为什么不用delete”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作