作者:你不必害怕q因为我会发光 | 来源:互联网 | 2023-06-12 15:42
在mysql中我使用delete删除了大量数据但是,数据表文件还是那么大,是怎么回事?mysql存放数据也是放在文件中的,在mysql中的innodb test表中有两个文件存储,
在mysql中 我使用delete 删除了大量数据但是,数据表文件还是那么大,是怎么回事?
mysql存放数据也是放在文件中的,在mysql中的innodb
test表中有两个文件存储,.frm文件用来存储表结构 .ibd文件是用来存储数据,在mysql8以后是允许把表结构和存放在数据表中
InnoDB 里的数据都是用 B+ 树的结构组织的。
假设,我们要删掉 500这个数据,InnoDB 引擎只会把 100个记录标记为删除。如果之后要再插入一个 ID 在 300 和 600 之间的记录时,可能会复用这个位置。但是,磁盘文件的大小并不会缩小。
在innodb中还存在数据页默认是16K 如果把这整个数据页删除,那就是数据页复用
但是,数据页的复用跟记录的复用是不同的。
记录的复用,只限于符合范围条件的数据。
而当整个页从 B+ 树里面摘掉以后,可以复用到任何位置
如果数据是按照索引递增顺序插入的,那么索引是紧凑的。但如果数据是随机插入的,就可能造成索引的数据页分裂。
在有些时候会发现id自增,但是突然发现有个id不见了,如 100 101 103 少了102 这时候查询数据表是能够查到102这个id,就被添加到空洞
如果要收缩一个表,只是 delete 掉表里面不用的数据的话,表文件的大小是不会变的,你还要通过 alter table 命令重建表,才能达到表文件变小的目的。
alter table t engine=innodb,ALGORITHM=inplace;
这个方式是可以考虑在业务低峰期使用的,而 MySQL 5.5 及之前的版本,这个命令是会阻塞 DML 的
如果整个表需要删除释放空间可以使用
truncate table T;