mysql空间满了怎么删除没有的_mysql 删除数据,空间为何没有回收

2ff34e647e2e3cdfd8dca593e17d9b0a.png

表结构数据和表数据

mysql1.8之前,表结构数据和表数据分开放,表结构放在.frm文件里面。在1.8后就放到一起了。

innodb_file_per_table

这个参数off是表数据放在共享表空间里面。和数据字典放在一起,on则是表数据单独存为一个后缀为。ibd的文件,当你drop的时候,系统也会删除这个文件,mysql5.6之后系统是默认开启这个这个参数的,也就是说,一个表文件会放在一个文件里面。通常是默认开启的。开启利于管理维护,当我们进行drop时就会直接删除这个文件。从而释放空间,否则放在共享表空间里面,即使删除了,也不会释放空间。

问题来了

因此我们直接删除表的时候会直接删除这个文件,但是删除部分数据的时候,我们会发现表空间没有被回收。

innodb删除流程

我们知道mysql innodb存储引擎里面存数据的方式是基于b+树。当删除一个记录,找到这个数据的时候,我们是将其标记为删除状态,而不是真的删除。等到有相关数据的时候那就可以直接插入进去。但是删除了一个页,那就和数据不太一样了,数据的复用是有局限性的,但是整个页是没有问题的。换句话说,你删除了某个数据,你填充这个数据只能是相关的,比如,这个数据页里面是6,7,8,你删除了7,你可以插入6到8之间的数据.或者可以在这个数据页里面的,如果是数据页,那么哪里都可以。同时如果相邻2个数据页的数据利用率很低,那么就会触发合并操作。是的另外一个页数据可复用。当我们使用delete指令的时候,我们进行的是逻辑删除,具体的数据页没有被回收,只是将其置换为可用状态,同时插入也是同样的道理。当你插入的数据在一个已经满了的数据页中间的时候,就要进行分页操作,那样也会造成大量空间被置为可用状态,但是不回收。

重建表

因此我们可以重建表来获取更加紧凑的结构。使用alter table A engine=InnoDB来进行重建操作,在mysql 5.5之前,逻辑是这样的,先构建一个临时表,然后把数据复制进去,在交换表名,删除旧表。显然这样的逻辑是全表锁的。中间是不能插入删除更新数据的,但是在之后就可以了,就是在上面的操作的过程中,增加一个临时文件,用来存储在这中间的ddl操作,最后再将其同步过去。其过程是先加写锁,再加读锁。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值