MySQL Delete 删数据后磁盘空间未释放的原因

 更新时间:2021年05月07日 17:18:22   作者:王文安  
这篇文章主要介绍了MySQL Delete 删数据后磁盘空间未释放的原因,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下

问题描述

在 MySQL 中使用 delete 语句删除数据之后,监控视图中可用的磁盘空间没有增加,磁盘使用率没有下降等等。

解决方案

delete 不释放空间是 MySQL 自身机制的原因,需要重建表才可以释放磁盘空间,可以参考的操作:

  1. 执行 optimize table ${table_name}。
  2. 如果是 InnoDB 的表,执行 alter table ${table_name} engine = innodb。

需要注意以下两个问题:

这两个命令都会重建表,尽量不要在磁盘空间紧张(>90%)的时候进行操作,先扩容磁盘,操作完之后再缩容。
这两个命令在开始和结束的时候都会尝试获取 metadata lock,所以尽量不要在业务高峰期执行。

问题分析

在 MySQL 的机制中,delete 删除的行只是被标记为删除状态,如果删除的行很多,整个数据页(innodb_page)的行都会被删除的时候,数据页也只会标记为删除,都不会真正的物理删除,而是一直占用,等待被复用。

例如:

可以看到 delete 前后,data_length 并没有发生变化,但是 data_free 增加了很多。这说明数据虽然删了,但是并没有被释放,仍旧被 test1 表占用,只是显示处于 free 状态,以后再写入新数据的时候就可以直接复用,而不需要在申请新的磁盘空间了。

这个时候使用alter table test1 engine = innodb 看看效果:

可以看到 data_length 和 data_free 都变成了空表的状态,仅有一个 innodb_page (默认 16k)。

PS:data_free 本身也可以用来评估表的空间碎片,当这个数字非常高的时候,可以考虑用同样的方法重建表,回收一部分磁盘空间。

以上就是MySQL Delete 删数据后磁盘空间未释放的原因的详细内容,更多关于MySQL 删数据后磁盘空间未释放的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL中的批量修改、插入操作数据库

    MySQL中的批量修改、插入操作数据库

    在平常的项目中,我们会需要批量操作数据库的时候,例如:批量修改,批量插入,那我们不应该使用 for 循环去操作数据库,这样会导致我们反复与数据库发生连接和断开连接,影响性能和增加操作时间,所以可以使用SQL 批量修改的方式去操作数据库,感兴趣的朋友一起学习下吧
    2023-09-09
  • MySql学习day03:数据表之间的连接、查询详解

    MySql学习day03:数据表之间的连接、查询详解

    这篇文章主要介绍了MySql数据表之间的连接、查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • MySQL中or用法及mybatis or用法详解

    MySQL中or用法及mybatis or用法详解

    在SQL查询语句中,OR关键字用于连接两个或多个条件,表示满足其中一个条件即可,当使用OR时,如果第一个条件为真,则不会检查第二个条件;如果第一个条件为假,则会检查第二个条件,这篇文章主要介绍了MySQL中or用法及mybatis or用法总结,需要的朋友可以参考下
    2024-05-05
  • MySQL 有关MHA搭建与切换的几个错误log汇总

    MySQL 有关MHA搭建与切换的几个错误log汇总

    这篇文章主要介绍了MySQL 有关MHA搭建与切换的几个错误log汇总,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL索引类型Normal、Unique和Full Text的讲解

    MySQL索引类型Normal、Unique和Full Text的讲解

    今天小编就为大家分享一篇关于MySQL索引类型Normal、Unique和Full Text的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 在MySQL concat里面使用多个单引号,三引号的问题

    在MySQL concat里面使用多个单引号,三引号的问题

    今天小编就为大家分享一篇在MySQL concat里面使用多个单引号,三引号的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 详解MySQL的字段默认null对唯一索引的影响

    详解MySQL的字段默认null对唯一索引的影响

    这篇文章主要为大家介绍了MySQL的字段默认null对唯一索引的影响详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • MySQL日志设置及查看方法

    MySQL日志设置及查看方法

    这篇文章主要介绍了MySQL日志设置及查看方法,需要的朋友可以参考下
    2017-05-05
  • mysql通过find_in_set()函数实现where in()顺序排序

    mysql通过find_in_set()函数实现where in()顺序排序

    这篇文章主要介绍了mysql通过find_in_set()函数实现where in()顺序排序的相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • mysql8连接不上问题及解决

    mysql8连接不上问题及解决

    这篇文章主要介绍了mysql8连接不上问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论