表数据既可以存在共享表空间里,也可以是单独的文件这个行为是由参数 innodb_file_per_table 控制的:
- 参数设置为OFF ,表的数据存放在系统表空间也就是跟数据字典放在一起
- 参数设置为ON,每个InnoDB 表数据存储在/ibd为后缀的文件
索引在InnoDB里的数据是鼡B+树存储的
当我们删除R4这个记录,InnoDB引擎会把R4,标记为删除以后再插入一个 ID 在 300-600之间的记录,就会复用这个位置但是磁盘文件的大小不会變。
因为InnoDB的数据是按页存储的那么如果我们删掉了一个数据页上的记录,那么整个数据页都可以复用了
- 如果相邻的两个数据页的利用率很小,系统会把这两个数据页上的数据合并一起那么其中另外一个数据页就可以标记机为可复用。
- 如果我们用delete命令把整个表的数据删那么所有的数据页都会标记为可复用,但是磁盘上的文件大小不会改变
这也就能解释为什么删除了很多数据行,但是表的文件大小并沒有改变
3.插入也会导致空间浪费
如果插入的数据是按顺序插入的那么索引就是紧凑的,但是如果数据是随机插入的那么可能造成索引嘚数据页分裂。
如果要处理数据空洞问题那么可以进行重建表操作:也就是创建一个相同表,把数据一行一行是插入到新表当中
可以使用下面的命令来进行重建表。