因为近期在重构优化一个业务的时候 发现有一张表(send_log)数据量将近1700W 左右 占用数据大小17G,索引18G左右 而我们的核心应用在使用的时候 会去临时查询这张表 获取一些数据 先不管设计的合不合理吧,因为是维护 不出问题为第一要务 所以想到要物理删除一下表数据 计划把18年1000W左右数据给腾出空间 但运维执行删除操作后 发现情况没有那么理想 行数是少了 但表空间 大小 没降下去
在 InnoDB 中,你的 delete 操作,并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记,标记为删除,因此你使用 delete 删除表中的数据,表文件在磁盘上所占空间不会变小,我们这里暂且称之为假删除。
对于这种情况,我们通常可以使用下面这个命令就能解决数据空洞问题。
optimize table t
这个命令的原理就是重建表,就是建立一个临时表 B,然后把表 A(存在数据空洞的表) 中的所有数据查询出来,接着把数据全部重新插入到临时表 B 中,***再用临时表 B 替换表 A 即可,这就是重建表的过程。
另外下面这个命令也可以实现重建表,可以达到跟上面一样的效果,而且推荐大家使用下面这个命令,大家可以试试。
alter table t engine=InnoDB
注意本文内容是基于 InnoDB 引擎,对于其他引擎可能存在一些差异。
原文链接:https://www.cnblogs.com/zhangfengshi/p/12511226.html