MySQL delete删除数据后,释放磁盘空间

这篇具有很好参考价值的文章主要介绍了MySQL delete删除数据后,释放磁盘空间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当 MySQL 数据库服务删除部分数据后;有些情况下这些数据占用的存储空间会释放掉,有些情况这些存储空间则不会释放。以下是对这种情况的简单说明:

一、删除表|清空数据表

当执行删除数据表或者清空数据表的全部数据操作时,都会释放掉相应的磁盘存储空间

drop table table_name;
truncate table table_name;

在MyISAM和InnoDB(innodb_file_per_table)存储引擎中,数据信息存在在单个文件中。删除表操作和清空数据表操作都会释放空间。

二、删除表数据

delete from table_name [where xxx];

使用delete删除的时候,MySQL并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,MySQL会利用这些已删除的空间再写入。即,删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。

三、优化表空间

方法一:

optimize table table_name ;

当表数据被大量删除后,释放占用的空间就变得很有必要了。会明显的提高查询速度。使用 optimize table。被删除的记录被保持在链接清单中,后续的 insert 操作会重新使用旧的记录位置。您可以使用 optimize table 来重新利用未使用的空间,并整理数据文件的碎片。optimize 适用于InnoDB和MyISAM存储引擎。

查看表占用硬盘空间大小的SQL语句如下:(默认用M做展示单位)

SELECT TABLE_NAME, (DATA_LENGTH+INDEX_LENGTH)/1048576 as size_Mb, TABLE_ROWS FROM information_schema.tables WHERE TABLE_SCHEMA='wow_tencent_1' AND TABLE_NAME='user'

方法二:

alter table tab_name  ENGINE = 'InnoDB';

注意:该操作执行的时候会把该表格先写入一个tmp临时表,所以磁盘剩余空间必须大于表空间,否则会执行失败。
方法三:
先将整个表的结构和数据导出来,删除整个表,再创建表,最后导入数据。生产环境不建议用这个方法

总结
通过从InnoDB存储空间分布,delete对性能的影响可以看到,delete物理删除既不能释放磁盘空间,而且会产生大量的碎片,导致索引频繁分裂,影响SQL执行计划的稳定性;

同时在碎片回收时,会耗用大量的CPU,磁盘空间,影响表上正常的DML操作。

在业务代码层面,应该做逻辑标记删除,避免物理删除;为了实现数据归档需求,可以用采用MySQL分区表特性来实现,都是DDL操作,没有碎片产生。

另外一个比较好的方案采用Clickhouse,对有生命周期的数据表可以使用Clickhouse存储,利用其TTL特性实现无效数据自动清理。文章来源地址https://www.toymoban.com/news/detail-655414.html

到了这里,关于MySQL delete删除数据后,释放磁盘空间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 删除文件后磁盘空间未释放,只能重启进程?(仅供参考)

    很多运维同学都遇到过“磁盘告警”,遇到这种情况就需要去清理磁盘。 这时候,很多同学通过各种途径、手段、命令找到了占用磁盘比较大的文件,然后大手一挥,  以为这样任务就完成了,谁知道,一查询磁盘使用量还是居高不下,完全没有释放。 这是因为在Linux中,如

    2024年02月11日
    浏览(26)
  • 【网络教程】如何解决Docker删除镜像和容器后磁盘空间未释放的问题

    当删除Docker镜像和容器后,磁盘空间并未释放,这可能导致磁盘空间不足。造成此问题的原因包括: Docker镜像和容器的删除策略:默认情况下,Docker不会立即删除镜像和容器,而是将它们保留30天。 联合文件系统(UnionFS)的特性:联合文件系统是Docker镜像的基础,它允许在

    2024年02月09日
    浏览(38)
  • 【已解决】Windows 的 docker 删除容器后 WSL2 磁盘空间不释放的问题

    很多同学拉取镜像使用一段时间后发现 C 盘快满了,把之前用过的镜像和容器删除,发现 WSL 挂载目录的虚拟磁盘大小没有变化,非常的奇怪。 其实,不同于 WSL1, WSL2 本质上是虚拟机 ,所以 Windows 会自动创建 vhdx 后缀的虚拟磁盘文件作为存储。这个 vhdx 后缀的虚拟磁盘文件

    2024年02月16日
    浏览(79)
  • mysql如何正确的删除数据(drop,delete,truncate)

    当我们需要删除 MySQL 数据库中的数据时,通常有三种可供选择的命令,即 DROP、DELETE 和 TRUNCATE。虽然这三个命令都可以用来删除数据,但它们之间有一些不同点。在本篇博客中,我们将会详细介绍这三个命令的用法和区别。 DROP 命令用于删除整个数据库或表。如果你想要删除

    2024年02月11日
    浏览(37)
  • Linux下 文件删除但是空间未被释放 或者 磁盘已满但找不到对应的大文件 的解决方案

    linux磁盘空间已满,手动rm -rf 删除了大文件之后,df -h 查看一下发现空间占用还是不变,有时候会想rm -rf 删除只是逻辑删除到回收站一样?其实不然,通常这种情况都是文件被删除,但是还被进程占用,因此删除文件空间未释放 通常的建议是 kill 掉对应的进程 ,但是如果是

    2024年02月12日
    浏览(29)
  • MySQL 数据库查询与数据操作:使用 ORDER BY 排序和 DELETE 删除记录

    使用 ORDER BY 语句按升序或降序对结果进行排序。 ORDER BY 默认按升序排序。要按降序排序结果,使用 DESC 。 示例按名称按字母顺序排序结果: ORDER BY DESC 使用 DESC 以降序排序结果。 示例按名称以字母逆序排序结果: 您可以使用\\\"DELETE FROM\\\"语句从现有表格中

    2024年02月05日
    浏览(63)
  • mongodb如何删除数据并释放空间

            mongodb删除数据后不会直接释放内存空间,是因为使用了一种称为“延迟删除”的策略。这意味着当一个文档被删除时,它仍然会占用一定的内存空间,直到这个空间被垃圾回收器(Garbage Collector)回收。         删除数据操作前建议先评估你的操作会有什么样的

    2024年02月06日
    浏览(31)
  • Mysql 数据库DML 数据操作语言—— 对数据库表中的数据进行更改UPDATE 和删除DELETE

        delete语句可以有条件,也可以没有,如果没有条件的话就是删除整张表 delete不可以删除表中某一个字段的值,但是update可以; 

    2024年01月19日
    浏览(45)
  • new char与delete[]问题,疑惑点终得解开:为什么释放指向的内存空间后,其中的数据还可以继续访问

    请问:将一个保存有字符串变量的指针等号赋值给另一个char*类型的变量,这个过程发生了什么? 解答:将一个保存有字符串变量的指针等号赋值给另一个 char* 类型的变量,实际上是将指针的值(即指向字符串的内存地址)复制给了另一个指针变量。这个过程并不会复制字符

    2024年02月15日
    浏览(45)
  • 阿里云mysql8小版本升级造成磁盘不断增长,undolog持续增长不释放

    现象: 1.用户升级之后,实例上磁盘空间以每分钟1g的速度不断增长, 2.高频dml表的空间不断变大但表数据其实不大,binlog大量产生 3.通过select * from innodb_tablespaces where name like \\\'%undo%\\\'发现undo 空间上涨较快,但阿里云监控视图显示正常。附问题截图: ##问题一磁盘持续增长 #

    2023年04月21日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包