MySQL实战第五篇

162 阅读2分钟

为什么表数据删掉一半,表文件的大小不变?

1:为啥删除了表的一半数据,表文文件大小没变化?

因为delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。也可以认为是一种逻辑删除,所以物理空间没有实际释放,只是标记为可复用,表文件的大小当然是不变的啦!

2:表的数据信息存在哪里?

表数据信息可能较小也可能巨大无比,她可以存储在共享表空间里,也可以单独存储在一个以.ibd为后缀的文件里,由参数innodb_file_per_table来控制,老师建议总是作为一个单独的文件来存储,这样非常容易管理,并且在不需要的时候,使用drop table命令也能直接把对应的文件删除,如果存储在共享空间之中即使表删除了空间也不会释放。

3:表的结构信息存在哪里?

首先,表结构定义占有的存储空间比较小,在MySQL8.0之前,表结构的定义信息存在以.frm为后缀的文件里,在MySQL8.0之后,则允许把表结构的定义信息存在系统数据表之中。

系统数据表,主要用于存储MySQL的系统数据,比如:数据字典、undo log(默认)等文件

4:如何才能删除表数据后,表文件大小就变小?

重建表,消除表因为进行大量的增删改操作而产生的空洞,使用如下命令:

alter table t engine=InnoDB

optimize table t( 等于 recreate+analyze)。

truntace table t (等于drop+create)

5:空洞是啥?

空洞是被标记可复用的空间。

6:空洞怎么产生的?

delete,insert,update都有可能产生空洞。 索引非递增导致页分裂,容易产生空洞。

7:什么时候使用 alter table t engine=InnoDB 会让一个表占用的空间反而变大?

将表 t 重建一次;

插入一部分数据,但是插入的这些数据,用掉了一部分的预留空间;

这种情况下,再重建一次表 t,就可能会出现问题中的现象。