mysql 快速回收表空间_12 - MySQL数据表空间回收问题

数据表空间回收问题

innodb表包含两个部分:表结构定义和数据, 在MySQL8.0之前,表结构是存在.frm为后缀的文件里,而.ibd是表数据存储的文件

我们在删除整个表的时候可以使用 drop table命令回收表空间,但是,我们遇到的更多的是删除某些行,这时我们就遇到了。表中的数据被删除了,但是表的空间却没有被回收

数据删除流程

假设一个表里面有id:1, 2, 3, 4, 5条数据。

假如我们要删除第4条这个记录,innodb引擎只会把ID=4这个记录标记删除,如果之后要再插入一个id在3和5之间的记录时,可能会复用这个位置,但是磁盘的文件并不会缩小

现在,你已经知道innodb的数据是按页存储的,那么如果我们删除一个数据页的所有记录,会怎么样??

当然是整个数据页就可以被复用了

但是数据页的复用跟记录的复用是不同的,记录的复用,只限于符合范围条件的数据

当整个数据页从B+树里面摘掉以后,可以复用到任何位置,如果相邻的两个数据页利用率都很小,系统就会把这两个页上的数据合到其中一个页上,另外一个数据页就会被标记可复用

如果说:delete命令把整个数据表的数据删除呢?那么就是所有的数据页都会标记为可复用,但是磁盘上的文件并不会变小。 也就是说delete不能回收表空间。 而没有被使用的空间,看起来就像是"空洞"

实际上,不止是删除数据会造成空洞,插入数据也会

也就是说经过大量增删改的表,都是可能存在空洞的,所以,能够把这些空洞去掉,就能达到收缩表空间的目的

那怎么可以把这些空洞去掉呢?

重建表

可以新建一个与之前表结构一样的表B,然后按照主键ID递增的顺序,一行行插入到B中,B是新建的,所以之前表的索引上的空洞就没有,你可以使用

ALTER TABLE A ENGINE = INNODB命令来重建

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值