表空间分析
表删掉了一半的数据,表文件的大小还是没变,这背后的原因是什么呢?
首先本文的全部分析依赖于InnoDB存储引擎,一个InnoDB表包含两部分,即:表结构定义和数据。表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数innodb_file_per_table
控制的。
OFF表示:表的数据放在系统共享表空间,也就是跟数据字典放在一起;
ON表示:每个InnoDB表数据存储在一个以 .ibd为后缀的文件中。
从MySQL5.6.6开始,这个参数默认为ON,将表结构和表数据分开存储,drop table的时候可以直接删掉这个文件。
数据删除流程
InnoDB的数据是通过B+树存储的,当删除某条记录时,并不是直接删掉,而是将这个位置标记为可复用,下次在相近位置插入数据时,就可以重用这个位置(这个位置就是一个空洞)。当整个数据页被删除之后,这个数据页也被标记为可重用,这也就是为什么delete 删除数据之后不会缩小占用空间的原因。除了删除数据,插入数据也可能由于页分裂、合并出现空洞。为了去掉这些空洞,真正缩小表的占用空间,就要进行表重建。
表重建:
可以使用alter table A engine=InnoDB
命令来重建表,从MySQL 5.6版本开始引入了Online DDL,在重建表的过程中,允许对表A做增删改操作。其主要流程如下:
1.建立一个临时文件,扫描表A主键的所有数据页&