平时的学习工作中,有的同学可能会发现一张表,删除了很多数据后,表的大小却没有改变,这是为什么呢?
这里我们需要了解一下删除的过程。
我们知道,innodb是按照页进行存储的。比如我们要删除R4这条数据,并不会真正释放这个空间,innodb引擎指挥将R4这条记录标记为删除,下次如果插入id再300-600之间的数据,该块区域便可以复用。
若整个数据页都被删干净了,那么该数据页也能够得到服用,这时不再有id的限制,任意范围的id都可能复用此数据页。
所以mysql delete操作仅仅进行了数据的逻辑上删除,并不会节省空间。删除后,那些仅仅被逻辑删除的数据便是一个个“空洞”。
另外,插入操作可能也会造成空洞。
上图所示,如果一个数据页满了,但是又要插入该数据页范围内的数据,pageA便会分页出pageB。pageA上可能出现空洞。
除此之外更新操作可能也会出现空洞。
总而言之一张经历了频繁增删改的表可能出现大量空洞,空间利用率很低。我们可以对表进行重构。
方式一:
可以使用以下命令:
alter table A engine=InnoDB
原理就是建一张新表插入原表的数据替换原表。由于是新建的表,不会有空洞。
方式二