目录
表数据的存储
表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的:
-
OFF表示存在系统共享表空间
- ON表示每张表存在一个独立的 XX.idb文件中 (drop table的时候 直接删除文件,如果是存在系统共享空间中,空间不会被回收)
为了方便管理,一般建议该值设置成on,5.6.6版本开始 这个值默认就是ON。
delete内幕
数据记录被删除,记录的物理空间不会被回收,只会标记成被删除 可复用,数据页也是一样。
引发的小问题
所以会导致一个诡异的事件->数据被delete了,但是磁盘空间不会变小
如何解决
1.重建一张新表 把数据全部迁移过去
由于大量的删除 更新 或者无序插入,会导致数据页很多空洞的地方无法被利用。重建一张表 顺序插入,充分填充数据页
2.alter table X
流程如下图,5.6之前的都是“离线”的不支持写入操作,5.6开始可以支持online DDL了 (具体的可以看online DDL那篇)
这个也是要业务低峰期操作
小细节
alter table t engine=innodb,ALGORITHM=inplace; 【默认就是这个】
这个里面的临时文件就是在innodb内部产生的
alter table t engine=innodb,ALGORITHM=copy;
这个临时文件是在server层做的