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 位网友参与,快来吐槽:

发表评论