背景
有时候删除了一张表一般的数据,但是查看表占用空间发现并没有发生变化。介是为嘛?
数据空洞
删除导致的数据空洞
InnoDB的底层是B+树,B+树的叶子节点存储数据,因为磁盘预读原理,一般叶子节点的大小会和page的大小保持一致。
当我们删除了数据后,并没有把申请的空间还给操作系统,而是将当前空间标记为“可复用”,这样当新数据插入时,就不同重新再申请空间,可以直接将数据插入到“可复用”的空间中;
这样“可复用”的空间,就称为数据空洞。
插入导致的数据空洞
当向一个page已满的叶子节点插入数据时,为了保证数据均衡,会把所有的数据再进行一次分配,使得两个节点的数据量不会相差太多,但也就会造成有很多的“可复用”空间。
解决方案
- 重建一张表,然后把数据刷进新表。
使用语句 alter table t engine = InnoDB - 在原表的基础上,压缩空间,去掉“可复用”空间。
使用语句 optimize table t