Mysql学习-为什么表的数据删除后,表的大小不变?

当在InnoDB存储引擎的表中删除数据时,实际上只是逻辑删除,不会立即释放空间,形成“空洞”。只有当数据页全部删除后,才能复用空间。这种现象导致表在经历频繁增删改后空间利用率降低。可以通过重建表来解决,如使用`ALTER TABLE ... ENGINE=InnoDB`或MySQL 5.6.6后的Online DDL来清理空洞,提高空间利用率。
摘要由CSDN通过智能技术生成

平时的学习工作中,有的同学可能会发现一张表,删除了很多数据后,表的大小却没有改变,这是为什么呢?

这里我们需要了解一下删除的过程。
在这里插入图片描述
我们知道,innodb是按照页进行存储的。比如我们要删除R4这条数据,并不会真正释放这个空间,innodb引擎指挥将R4这条记录标记为删除,下次如果插入id再300-600之间的数据,该块区域便可以复用。

若整个数据页都被删干净了,那么该数据页也能够得到服用,这时不再有id的限制,任意范围的id都可能复用此数据页。

所以mysql delete操作仅仅进行了数据的逻辑上删除,并不会节省空间。删除后,那些仅仅被逻辑删除的数据便是一个个“空洞”。

另外,插入操作可能也会造成空洞。
在这里插入图片描述
上图所示,如果一个数据页满了,但是又要插入该数据页范围内的数据,pageA便会分页出pageB。pageA上可能出现空洞。

除此之外更新操作可能也会出现空洞。

总而言之一张经历了频繁增删改的表可能出现大量空洞,空间利用率很低。我们可以对表进行重构。

方式一:
可以使用以下命令:
alter table A engine=InnoDB
原理就是建一张新表插入原表的数据替换原表。由于是新建的表,不会有空洞。

方式二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不认识CBW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值