表数据删掉一半,表文件大小不变
针对 MySQL 中应用最广泛的 InnoDB 。一个 InnoDB 表包含两部分,即:表结构定义和数据。
在 MySQL 8.0 版本以前,表结构是存在以.frm 为后缀的文件里。而 MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,所以我们今天主要讨论的是表数据。
innodb_file_per_table
这个参数用于控制表数据既可以存在共享表空间里,也可以是单独的文件。
- 设置为 OFF 表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起
- 参数设置为 ON 表示的是,每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件中
设置为ON在删除整表时,drop table可以把整个.ibd文件删除释放空间,如果OFF即使表删除,空间也不会回收·
数据删除流程
innodb中数据是按页存储的如果删掉一个页的所有内容整个页都会被复用。
如果数据是300,400,500 你删除了400 这个位置就是空洞,但是插入600并不会复用这个空间。记录的复用只限于符合范围的条件 350就可以复用这个空间
如果相邻的两个数据页利用率都很小,系统就会把这两个页上的数据合到其中一个页上,另外一个数据页就被标记为可复用。
所以delete数据,只是把记录的位置 或者数据页标记为“可复用”,但是磁盘大小不会变
不止是删除数据会造成空洞,插入数据也会
如果数据是按照索引递增顺序插入的,那么索引是紧凑的。但如果数据是随机插入的,就可能造成索引的数据页分裂。
通过重建表可以达到把空洞去掉,收缩表空间的目的
alter table A engine=innodb这个命令可以用来重建表
浙公网安备 33010602011771号